HDU 5521 Meeting
2015-11-04 08:50
330 查看
2015 ACM / ICPC 沈阳站现场赛 M题
最短路
设置N+M个节点,前N个节点是Block,后M个节点是Set,每一组Set中的点向该Set连边,从1和n开始分别求最短路。注意爆int。
最短路
设置N+M个节点,前N个节点是Block,后M个节点是Set,每一组Set中的点向该Set连边,从1和n开始分别求最短路。注意爆int。
#include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<queue> #include<algorithm> using namespace std; const long long INF=1e16; const int maxn=200000+10; const int maxm=5000000+10; long long dis1[maxn],dis2[maxn],val[maxn]; bool flag1[maxn],flag2[maxn]; vector<int>G[maxn]; vector<int>Ans; struct Edge { int from; int to; }e[maxm]; int T,n,m,tot; void init() { memset(val,0,sizeof val); memset(flag1,0,sizeof flag1); for(int i=0;i<maxn;i++) dis1[i]=INF; memset(flag2,0,sizeof flag2); for(int i=0;i<maxn;i++) dis2[i]=INF; for(int i=0;i<maxn;i++) G[i].clear(); Ans.clear(); tot=0; } void AddEdge(int x,int y) { tot++; e[tot].from=x; e[tot].to=y; G[x].push_back(tot); tot++; e[tot].from=y; e[tot].to=x; G[y].push_back(tot); } void spfa1() { queue<int>Q; Q.push(1); flag1[1]=1;dis1[1]=0; while(!Q.empty()) { int h=Q.front(); Q.pop(); flag1[h]=0; for(int i=0;i<G[h].size();i++) { int id=G[h][i]; if(dis1[h]+val[e[id].to]<dis1[e[id].to]) { dis1[e[id].to]=dis1[h]+val[e[id].to]; if(flag1[e[id].to]==0) { flag1[e[id].to]=1; Q.push(e[id].to); } } } } } void spfa2() { queue<int>Q; Q.push(n); flag2 =1;dis2 =0; while(!Q.empty()) { int h=Q.front(); Q.pop(); flag2[h]=0; for(int i=0;i<G[h].size();i++) { int id=G[h][i]; if(dis2[h]+val[e[id].to]<dis2[e[id].to]) { dis2[e[id].to]=dis2[h]+val[e[id].to]; if(flag2[e[id].to]==0) { flag2[e[id].to]=1; Q.push(e[id].to); } } } } } int main() { scanf("%d",&T); for(int Case=1;Case<=T;Case++) { init(); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int s,x; long long t; scanf("%lld%d",&t,&s); val[n+i]=t; for(int j=1;j<=s;j++) { scanf("%d",&x); AddEdge(x,n+i); } } spfa1(); spfa2(); long long ans=INF; for(int i=1;i<=n;i++) { if(dis1[i]==INF||dis2[i]==INF) continue; if(max(dis1[i],dis2[i])<ans) ans=max(dis1[i],dis2[i]); } printf("Case #%d: ",Case); if(ans==INF) printf("Evil John\n"); else { printf("%lld\n",ans); for(int i=1;i<=n;i++) { if(dis1[i]==INF||dis2[i]==INF) continue; if(max(dis1[i],dis2[i])==ans) Ans.push_back(i); } for(int i=0;i<Ans.size();i++) { printf("%d",Ans[i]); if(i<Ans.size()-1) printf(" "); else printf("\n"); } } } return 0; }
相关文章推荐
- 各大招聘网站信息实时查询浏览【二】
- git did not exit cleanly (exit code 128)的解决方案
- C#通过并口连接斑马打印机
- GridView事件DataBinding,DataBound,RowCreated,RowDataBound区别及执行顺序分析
- Facebook Android客户端热更新
- 如何在代码和xml中实现中划线的方法!
- MDK5+CH340驱动安装
- Recover the home data frome Linux
- java发送电子邮件email
- 搭建C语言开发环境(Windows平台)汇总
- android异常
- 五款“已故”操作系统以及它们所带来的启示
- ”数独“android小游戏
- Spark 数据挖掘 - 利用决策树预测森林覆盖类型
- FPGA4U FPGA SDRAM Controller
- WP、Win10开发或者WPF开发时绘制自定义窗体~例如:一个手机
- leetcode Climbing Stairs python
- (封装)容器视图控制器(适用于新闻框架)
- nmon的安装与使用
- 机器视觉LED光源照明技术说明