码迷,mamicode.com
首页 > 其他好文 > 详细

并查集

时间:2015-10-01 09:11:16      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:

题目: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!