HDU1598

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1598

解题思路:

  详见代码及注释。

AC代码:

 1 #include <algorithm>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 const int maxn=205,maxm=1005,inf=0x7ffffff;
 6 struct edge{
 7     int u,v,spe;
 8 }es[maxm];
 9 int n,m;
10 int fa[maxn];
11 bool cmp(edge &a,edge &b){
12     return a.spe<b.spe;
13 }
14 int finds(int x){
15     if(x==fa[x])    return x;
16     return fa[x]=finds(fa[x]);
17 }
18 int main(){
19     int Q,a,b;
20     while(scanf("%d%d",&n,&m)==2){
21         for(int i=0;i<m;i++)
22             scanf("%d%d%d",&es[i].u,&es[i].v,&es[i].spe);
23         sort(es,es+m,cmp);  //对每一条边根据限速从小到大进行排序
24         scanf("%d",&Q);
25         while(Q--){
26             scanf("%d%d",&a,&b);
27             int ans=inf;
28             for(int i=0;i<m;i++){   //外层循环从限速最小的那条边开始遍历,此时的最小速度即为这个
29                 bool can=false;
30                 for(int j=1;j<=n;j++)   fa[j]=j;
31                 for(int j=i;j<m;j++){   //内层循环
32                     edge e=es[j];
33                     int t1=finds(e.u),t2=finds(e.v);    //并查集
34                     if(t1!=t2){
35                         fa[t1]=t2;
36                         if(finds(a)==finds(b)){//一旦使得a和b相连,记录下此时的舒适度,并更新ans,退出内层循环
37                             ans=min(ans,es[j].spe-es[i].spe);
38                             can=true;
39                             break;
40                         }
41                     }
42                 }
43                 if(!can||ans==0)    break;  //如果ans=0(没有办法更好)或者a和b无法联通(最小速度没有办法更大),退出外层循环
44             }
45             if(ans==inf)    printf("-1\n");
46             else    printf("%d\n",ans);
47         }
48     }
49     return 0;
50 }

 

转载于:https://www.cnblogs.com/Blogggggg/p/7430020.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值