HDU 1598--并查集+贪心

题意:中文题,不解释。

思路:按照Flycar的速度(即边权)排序,通过并查集依次将边添加进去,枚举各种情况。

AC代码:

复制代码
View Code
 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 struct node {
 5     int s,t,v;
 6     bool operator < (const node &cmp) const{
 7         return v<cmp.v;
 8     }
 9 }edge[1010];
10 int p[222];
11 int findx(int x)
12 {
13     if(x!=p[x])
14         p[x]=p[findx(p[x])];
15     return p[x];
16 }
17 void merge(int x,int y)
18 {
19     p[findx(x)]=findx(y);
20 }
21 int main()
22 {
23     int n,m,i,j,q,s,t;
24     while(~scanf("%d %d",&n,&m))
25     {
26         for(i=0;i<m;i++)
27             scanf("%d %d %d",&edge[i].s,&edge[i].t,&edge[i].v);
28         sort(edge,edge+m);
29         scanf("%d",&q);
30         while(q--)
31         {
32             scanf("%d %d",&s,&t);
33             int Min=0x3f3f3f3f;
34             for(i=0;i<m;i++)
35             {
36                 for(j=1;j<=n;j++)
37                     p[j]=j;
38                 for(j=i;j<m;j++)
39                 {
40                     merge(edge[j].s,edge[j].t);
41                     if(findx(s)==findx(t))
42                     {
43                         Min=min(Min,edge[j].v-edge[i].v);
44                         break;
45                     }
46                 }
47             }
48             if(Min==0x3f3f3f3f)
49                 puts("-1");
50             else
51                 printf("%d\n",Min);
52         }
53     }
54     return 0;
55 }
复制代码

 

posted on 2013-04-29 20:46  acoderworld  阅读(76)  评论(0)    收藏  举报

努力加载评论中...

导航

点击右上角即可分享
微信分享提示