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\n",cha[i]);
58             else printf("-1\n");
59     }
60     return 0;
61 }

 

转载于:https://www.cnblogs.com/Acgsws/p/3216780.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值