并查集

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

 

https://zh.wikipedia.org/wiki/%E5%B9%B6%E6%9F%A5%E9%9B%86

http://www.cnblogs.com/nanke/archive/2012/02/13/2350008.html

想不到并查集这样用

对于题目中的路,按速度进行排序,这样,如果从第 i 条路到第 j 条路之间的所有路能够让 i 和 j 连通,那么,这就存在一条路,且这条路的舒适度就是 两者的差值。  这样,只要枚举从每一条路开始,向前找到可以使得 起点和终点连通的路的舒适度,就可以找到答案了

 

代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <math.h>
 4 #include <limits.h> 
 5 #include <algorithm>
 6 #include <iostream>
 7 #include <ctype.h>
 8 #include <iomanip>
 9 #include <queue>
10 #include <map>
11 #include <stdlib.h>
12 using namespace std;
13 
14 int f[201],n,m;
15 struct lu
16 {
17     int startcity,endcity,speed;
18 }num[1010];
19 
20 bool cmp(lu a,lu b)
21 {
22     return a.speed < b.speed;
23 }
24 
25 void init()
26 {
27     for(int i=0;i<=n;i++)
28         f[i]=i;
29 }
30 
31 int find(int x)
32 {
33     if(x==f[x])
34         return f[x];
35     f[x]=find(f[x]);
36     return f[x];
37 }
38 
39 void Union(int x,int y)
40 {
41     int a=find(x);
42     int b=find(y);
43     if(a==b)
44         return; 
45     f[a]=b;
46 }
47 
48 int main()
49 {
50     int p;
51     while(scanf("%d %d",&n,&m)==2){
52         for(int i=0;i<m;i++)
53             scanf("%d %d %d",&num[i].startcity,&num[i].endcity,&num[i].speed);
54         sort(num,num+m,cmp);
55         scanf("%d",&p);
56         while(p--){
57             int x,y;
58             int ans=INT_MAX;
59             scanf("%d %d",&x,&y);
60             for(int i=0;i<m;i++){
61                 init();
62                 int flag=0,k=0;
63                 for(int j=i;j<m;j++){
64                     Union(num[j].startcity,num[j].endcity);
65                     if(find(x)==find(y)){
66                         flag=1;
67                         k=j;
68                         break;
69                     }
70                 }
71                 if(!flag)
72                     break;
73                 ans=min(ans,num[k].speed-num[i].speed);
74             }
75             if(ans==INT_MAX)
76                 printf("-1\n");
77             else
78                 printf("%d\n",ans);
79         }
80     }
81     return 0;
82 }

 

 PS:#include <limits.h> 
這一行所載入的表頭檔為一些關於整數值檔案極限大小的定義, 
此表頭檔裡有一行 
#define INT_MIN(-INT_MAX-1) 
意思就是定義了INT_MIN這個字的範圍為(-INT_MAX-1) 
而INT_MAX的範圍則在前一行被定義為 2147483647 
#define INT_MAX2147483647 
故 你的INT_MAX在這裡的時候的數值是 (-2147483647-1) 
就是"-2147483648"啦! 
那你輸入任何數跟他比較的話,他一定是最小的, 

posted @ 2015-10-01 08:50  Vmetrio  阅读(164)  评论(0编辑  收藏  举报