hdu1598(并查集)

将边从小到大排序,然后从最小的开始枚举,判断连通,得到当前的速度最小差,比较得出最小值。

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 using namespace std;
 5 struct po
 6 {
 7     int u,v,w;
 8 } s[1005];
 9 int p[1005];
10 int cmp(po a,po b)
11 {
12     return a.w<b.w;
13 }
14 int findSet(int x)
15 {
16     if (p[x] == x)
17         return x;
18     return findSet(p[x]);
19 }
20 int main()
21 {
22     int n,m;
23     while(scanf("%d%d",&n,&m)!=EOF)
24     {
25         for(int i=0;i<m;i++)
26         scanf("%d%d%d",&s[i].u,&s[i].v,&s[i].w);
27         sort(s,s+m,cmp);
28         for(int i=0;i<=n;i++) p[i]=i;
29         int t;
30         scanf("%d",&t);
31             int st[20],en[20],num[20],cha[20];
32             for(int i=0;i<t;i++)
33                 scanf("%d%d",&st[i],&en[i]);
34             memset(num,0,sizeof(num));
35             for(int i=0;i<t;i++)
36             cha[i]=2000000;
37             for(int k=0;k<m;k++)
38             {
39                 for(int i=0;i<=n;i++) p[i]=i;
40                 for(int i=k;i<m;i++)
41                 {
42                     int fx = findSet(s[i].u);
43                     int fy = findSet(s[i].v);
44                     if (fx != fy)
45                     p[fx] = fy;
46                     for(int j=0;j<t;j++)
47                     if(findSet(st[j])==findSet(en[j])&&num[j]==0)
48                     {
49                         if(s[i].w-s[k].w<cha[j])
50                         cha[j]=s[i].w-s[k].w;
51                     }
52                 }
53             }
54 
55             for(int i=0;i<t;i++)
56             if(cha[i]!=2000000)
57             printf("%d
",cha[i]);
58             else printf("-1
");
59     }
60     return 0;
61 }
原文地址:https://www.cnblogs.com/Acgsws/p/3216780.html