标签:
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1598
https://zh.wikipedia.org/wiki/%E5%B9%B6%E6%9F%A5%E9%9B%86
http://www.cnblogs.com/nanke/archive/2012/02/13/2350008.html
想不到并查集这样用
对于题目中的路,按速度进行排序,这样,如果从第 i 条路到第 j 条路之间的所有路能够让 i 和 j 连通,那么,这就存在一条路,且这条路的舒适度就是 两者的差值。 这样,只要枚举从每一条路开始,向前找到可以使得 起点和终点连通的路的舒适度,就可以找到答案了
代码:
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 struct edge 5 { 6 int u,v,w; 7 }e[1001]; 8 int f[201],n,m; 9 bool cmp(edge a,edge b) 10 { 11 return a.w<b.w; 12 } 13 void init() 14 { 15 for(int i=0;i<=n;i++) 16 f[i]=i; 17 } 18 int find(int x) 19 { 20 if(x==f[x]) 21 return f[x]; 22 f[x]=find(f[x]); 23 return f[x]; 24 } 25 void Union(int x,int y) 26 { 27 int a=find(x); 28 int b=find(y); 29 if(a==b) 30 return; 31 f[a]=b; 32 } 33 int main() 34 { 35 int Q; 36 while(scanf("%d %d",&n,&m)==2) 37 { 38 for(int i=0;i<m;i++) 39 scanf("%d %d %d",&e[i].u,&e[i].v,&e[i].w); 40 sort(e,e+m,cmp); 41 scanf("%d",&Q); 42 while(Q--) 43 { 44 int x,y; 45 int ans=INT_MAX; 46 scanf("%d %d",&x,&y); 47 for(int i=0;i<m;i++) 48 { 49 init(); 50 int flag=0,k=0; 51 for(int j=i;j<m;j++) 52 { 53 // cout<<e[j].u<<‘ ‘<<e[j].v<<endl; 54 Union(e[j].u,e[j].v); 55 if(find(x)==find(y)) 56 { 57 flag=1; 58 k=j; 59 break; 60 } 61 // cout<<find(x)<<‘ ‘<<find(y)<<endl; 62 } 63 if(!flag) break; 64 ans=min(ans,e[k].w-e[i].w); 65 } 66 if(ans==INT_MAX) 67 printf("-1\n"); 68 else printf("%d\n",ans); 69 } 70 } 71 return 0; 72 }
标签:
原文地址:http://www.cnblogs.com/wangmengmeng/p/4850654.html