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 }

 

posted @ 2017-08-25 23:09  Blogggggg  阅读(141)  评论(0编辑  收藏  举报