hdu 1811 二分+并查集

 1 #include "stdio.h"  //二分+并查集,,想想道理何在!
 2 #include "stdlib.h"
 3 #include "algorithm"
 4 using namespace std;
 5 #define INF 0x3fffffff
 6 struct node{
 7     int x,y,dis;
 8 }a[1005];
 9 
10 int set[1005];
11 
12 int find(int x){
13     if(set[x]!=x)
14         set[x] = find(set[x]);
15     return set[x];        
16 }
17 
18 int cmp(node u,node v)
19 {
20     return u.dis < v.dis;    
21 }
22 
23 void Union(int x,int y)
24 {        
25     set[find(x)] = find(y);        
26 } 
27 
28 void init(int n) 
29 {
30     int i;
31     for(i=1;i<=n;i++)
32         set[i] = i;    
33 }
34 
35 int main()
36 {
37     int i,j;
38     int n,m,q;
39     while(scanf("%d%d",&n,&m)!=-1)
40     {
41         int x,y,k;
42         for(i=0;i<m;i++)
43         {
44             scanf("%d%d%d",&x,&y,&k);
45             a[i].x = x;
46             a[i].y = y;
47             a[i].dis = k;
48         }
49         sort(a,a+m,cmp);
50         scanf("%d",&q);
51         int min;
52         while(q--)
53         {
54             scanf("%d%d",&x,&y);
55             min = INF;
56             for(i=0;i<m;i++)
57             {
58                 init(n);
59                 for(j=i;j<m;j++)
60                 {
61                     Union(a[j].x,a[j].y);
62                     if(find(x) == find(y))
63                         break;
64                 }
65                 if(j==m) break;
66                 if(min>a[j].dis-a[i].dis)
67                     min = a[j].dis - a[i].dis;
68             }
69             if(min == INF)
70                 printf("-1
");
71             else
72                 printf("%d
",min);
73         }
74     }
75     return 0;
76 }



原文地址:https://www.cnblogs.com/ruo-yu/p/4412010.html