HDU 5521 [ACM 2015 沈阳] Meeting [最短路]
2015-10-31 21:27
417 查看
题意:给出一个图,共N个点,并且给出M个点集 Si,对于Si中的每个点,其两两之间有一条距离为 Di 的连边,现在要从1-N中选出一个点,让其到1与N的最短路的的最大值最小,问结果与方案。
范围:Σ Size of Si <=100W, N<=10W M<=10W
解法:按集合建点,集合中的每个点与其对应的块连一条长度为Di的边即可,最后分别以1,N为原点做两遍SPFA或者Dijsktra即可,注意最后求得的距离需要除以2
代码:
范围:Σ Size of Si <=100W, N<=10W M<=10W
解法:按集合建点,集合中的每个点与其对应的块连一条长度为Di的边即可,最后分别以1,N为原点做两遍SPFA或者Dijsktra即可,注意最后求得的距离需要除以2
代码:
#include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> #include<iostream> #include<stdlib.h> #include<set> #include<map> #include<queue> #include<vector> #include<bitset> #pragma comment(linker, "/STACK:1024000000,1024000000") template <class T> bool scanff(T &ret){ //Faster Input char c; int sgn; T bit=0.1; if(c=getchar(),c==EOF) return 0; while(c!='-'&&c!='.'&&(c<'0'||c>'9')) c=getchar(); sgn=(c=='-')?-1:1; ret=(c=='-')?0:(c-'0'); while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0'); if(c==' '||c=='\n'){ ret*=sgn; return 1; } while(c=getchar(),c>='0'&&c<='9') ret+=(c-'0')*bit,bit/=10; ret*=sgn; return 1; } #define inf 1073741823 #define llinf 4611686018427387903LL #define PI acos(-1.0) #define lth (th<<1) #define rth (th<<1|1) #define rep(i,a,b) for(int i=int(a);i<=int(b);i++) #define drep(i,a,b) for(int i=int(a);i>=int(b);i--) #define gson(i,root) for(int i=ptx[root];~i;i=ed[i].next) #define tdata int testnum;scanff(testnum);for(int cas=1;cas<=testnum;cas++) #define mem(x,val) memset(x,val,sizeof(x)) #define mkp(a,b) make_pair(a,b) #define findx(x) lower_bound(b+1,b+1+bn,x)-b #define pb(x) push_back(x) using namespace std; typedef long long ll; typedef pair<int,int> pii; #define NN 2001000 struct edge{ int v,next; ll w; edge(){} edge(int vv,int nn,ll ww):v(vv),next(nn),w(ww){} }ed[NN]; int lnum,ptx[NN]; int n,m; void init(){ lnum=0; rep(i,1,n+m)ptx[i]=-1; } inline void addline(int x,int y,ll w){ ed[lnum]=edge(y,ptx[x],w); ptx[x]=lnum++; } ll dis1[NN]; ll dis2[NN]; int q[NN]; bool vis[NN]; void spfa(ll *dis,int root){ int head,tail; head=tail=0; rep(i,1,n+m)dis[i]=llinf,vis[i]=0; q[tail++]=root; dis[root]=0; vis[root]=1; while(head<tail){ int x=q[head++]; vis[x]=0; gson(i,x){ int y=ed[i].v; if(dis[x]+ed[i].w<dis[y]){ dis[y]=dis[x]+ed[i].w; if(!vis[y]){ vis[y]=1; q[tail++]=y; } } } } } vector <int> a; int main(){ tdata{ scanff(n);scanff(m); init(); rep(i,1,m){ int num,x; ll dis; scanff(dis);scanff(num); rep(j,1,num){ scanff(x); addline(x,n+i,dis); addline(n+i,x,dis); } } spfa(dis1,1); spfa(dis2,n); ll ans=llinf; rep(i,1,n){ if(max(dis1[i],dis2[i])==ans){ a.pb(i); } if(max(dis1[i],dis2[i])<ans){ a.clear(); ans=max(dis1[i],dis2[i]); a.pb(i); } } printf("Case #%d: ",cas); if(ans==llinf)printf("Evil John\n"); else { printf("%lld\n",ans>>1); printf("%d",a[0]); rep(i,1,a.size()-1){ printf(" %d",a[i]); } printf("\n"); } } return 0; }
相关文章推荐
- Python Excel解析
- Unix环境高级编程学习笔记之进程环境(1)
- 常用的正则表达式
- 20151031的NOIP模拟赛
- C-指针
- 支持Python3的图表库
- [hdu5521 Meeting]最短路
- Ubuntu 14.04 安装 Python3
- 项目冲刺链接汇总
- 导航布局和视频弹出框制作
- Python验证码识别处理实例
- c语言之动态栈的功能实现
- 错误处理:vmware下克隆centos7配置静态ip地址网卡问题
- 2015ACM/ICPC亚洲区沈阳站-重现赛 1004 Pagodas
- leetcode 220: Contains Duplicate III Java
- Xcode插件及cocoapods不能正常使用的解决方法
- shiro简介
- JAVA 多线程--了解线程
- jpa起源
- LINUX_bash