XJOI NOIP16提高组赛前训练19-day1 T2:过路费(SPFA)
来源:互联网 发布:淘宝修改库存影响权重 编辑:程序博客网 时间:2024/06/07 05:56
XJOI NOIP16提高组赛前训练19-day1 T2:过路费
题目描述:
有一天你来到了一个奇怪的国家,它有N个城市,城市之间有若干条双向道路连接,每条道路都有一定的费用,经过城市也要一定的费用.从一个城市到达另一个城市的总花费为路径上费用最大的城市费用(包括起点和终点)加上路径上所有的道路的费用.给出Q次询问,分别回答每次询问中两城市间的最少花费.保证城市之间可以互达.
输入格式:
第一行两个整数N,M,表示有N个城市M条道路.
接下来N行每行一个整数,表示城市的费用ci.
接下来M行每行三个整数,x,y,z,表示城市x和城市y间有一条费用为z的道路.
接下来一行一个整数Q,表示询问次数.
接下来Q行每行两个整数x,y(x不等于y),表示询问从城市x到城市y的最小花费.
输出格式:
共Q行每行一个整数,第i行的整数表示第i次询问的答案.
样例输入:
3 3
1
3
2
1 2 1
2 3 1
1 3 3
2
1 3
1 3
样例输出:
5
5
数据范围:
对于30%的数据,N<=10,M<=20,Q<=5.
对于60%的数据,N<=200,M<=4000,Q<=100.
对于100%的数据,N<=300,M<=40000,Q<=100000,1<=ci<=100000,1<=z<=1000.
时间限制:
2S
空间限制:
512M
题目分析:
题目中有两个限制条件,要使的路径和+最大点权小.显然,同时维护两个是不便的,那么不妨先限制其中一个条件,在此情况下的另一个条件尽可能的小.那么,可以先枚举最大点权点,在此基础上求最短路,然后看能否更新答案.
代码:
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<queue>using namespace std;const int INF=(1<<30);const int maxn=300+10;const int maxm=40000+10;int read(){ char ch=getchar();int ret=0,flag=1; while(ch<'0'||ch>'9') {if(ch=='-') flag=-1; ch=getchar();} while(ch>='0'&&ch<='9') ret=ret*10+ch-'0',ch=getchar(); return ret*flag;}int fir[maxn],nxt[maxm<<1],to[maxm<<1],val[maxm<<1],ecnt;void add_edge(int u,int v,int w){ nxt[++ecnt]=fir[u];fir[u]=ecnt;to[ecnt]=v;val[ecnt]=w; nxt[++ecnt]=fir[v];fir[v]=ecnt;to[ecnt]=u;val[ecnt]=w;}int cost[maxn],ans[maxn][maxn],N,M;//cost[i]表示i点点权,ans[i][j]记录从i到j的答案int dis[maxn],inq[maxn];//dis[i]表示最大费用确定下的单源最短路 void SPFA(int s){ memset(inq,0,sizeof(inq)); memset(dis,63,sizeof(dis)); queue<int>q;q.push(s); dis[s]=0;inq[s]=1; while(!q.empty()) { int u=q.front(); q.pop(); inq[u]=0; for(int i=fir[u];i;i=nxt[i]) { int v=to[i],w=val[i]; if(cost[v]>cost[s]) continue; if(dis[v]>dis[u]+w) { dis[v]=dis[u]+w; if(!inq[v]) q.push(v),inq[v]=1; } } } for(int i=1;i<=N;i++) for(int j=1;j<=N;j++) ans[i][j]=min(ans[i][j],dis[i]+dis[j]+cost[s]);//尝试用两点到s的距离加上cost[s]来更新答案}int main(){ N=read(),M=read(); for(int i=1;i<=N;i++) cost[i]=read(); for(int u,v,w,i=1;i<=M;i++) { u=read();v=read();w=read(); add_edge(u,v,w); } for(int i=1;i<=N;i++) for(int j=1;j<=N;j++) if(i!=j) ans[i][j]=INF; for(int i=1;i<=N;i++) SPFA(i); int Q=read(); while(Q--) { int x=read(),y=read(); printf("%d\n",ans[x][y]); } return 0;}
0 0
- XJOI NOIP16提高组赛前训练19-day1 T2:过路费(SPFA)
- XJOI NOIP16提高组赛前训练17 T2:StopAllSounds(DP)
- XJOI NOIP16提高组赛前训练17 T1:GotoAndPlay(二分图染色)
- XJOI NOIP16提高组赛前训练18-day2 T1:友好数对(数论)
- XJOI-NOIP2015提高组模拟题1 day1
- 信息传递 NOIP2015 提高组 Day1 T2
- 选择客栈 NOIP2011 提高组 Day1 T2
- NOIP 2014 提高组 Day1 T2 联合权值
- Noip提高组2015 Day1 T2 信息传递 tarjan
- Noip提高组 2014 Day1 T2 联合权值 模拟
- NOIP 2012 提高组 DAY1 T2 国王游戏
- Noip 2013 提高组 Day1 T2 火柴排队
- 【XJOI】NOIP2016提高组冲剌题1 T2 道路规划
- XJOI NOIP2016提高组冲剌题1 T2:道路规划(LIS)
- C++——NOIP2016提高组day1 t2——天天爱跑步
- C++&Pascal——NOIP2015提高组day1 t2——信息传递
- XJOI NOIP2015模拟赛Day1 T2 ctps bitset优化 或 排序+cdq分治+树状数组+平衡树
- SSL2677 2017年8月10号提高组T2 飞行(spfa)
- 个人直播背后的技术分析
- nginx设置Expires和Cache-Control
- Loading.js加载框架
- mysql存储过程建立临时表,从别的表赋值给这个临时表
- swift 分支结构
- XJOI NOIP16提高组赛前训练19-day1 T2:过路费(SPFA)
- 禁止外部用户访问apache上的phpMyAdmin
- BiliBili直播 弹幕信息抓取
- 拓扑排序 JAVA实现
- Android studio中App签名打包相关操作的注意事项
- sortTable---一个指令是你的表格可以排序
- win7 多任务
- 关于列转行的两个函数(listagg,wm_concat)结果空白问题
- Android Studio中 EventBus的使用demo(一)