1. 程式人生 > >hdu1598 find the most comfortable road 枚舉+最小生成樹

hdu1598 find the most comfortable road 枚舉+最小生成樹

esp () fin find use 枚舉 生成樹 nio while

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define MAXN 210
 5 #define INF 2147483646
 6 using namespace std;
 7 
 8 int f[MAXN], Rank[MAXN];    //Rank長度
 9 int n, m, pos;
10 
11 struct Edge{
12     int u, v, val;
13     //按照val從小到大排列
14     friend bool
operator<(const Edge&a, const Edge&b){ 15 return a.val < b.val; 16 } 17 }arr[MAXN*MAXN]; 18 19 void init(){ 20 for (int i = 0; i<MAXN; ++i) 21 f[i] = i, Rank[i] = 0; 22 } 23 24 int find(int x){ 25 int i, j = x; 26 while (j != f[j]) j = f[j];
27 while (x != j){ 28 i = f[x]; f[x] = j; x = i; 29 } 30 return j; 31 } 32 33 void Union(int x, int y){ 34 int a = find(x), b = find(y); 35 if (a == b)return; 36 if (Rank[a]>Rank[b]) 37 f[b] = a; 38 else{ 39 if (Rank[a] == Rank[b])
40 ++Rank[b]; 41 f[a] = b; 42 } 43 } 44 45 int main(){ 46 int u, v, speed, Q; 47 while (scanf("%d%d", &n, &m) != EOF){ 48 for (int i = 0; i<m; ++i) 49 scanf("%d%d%d", &arr[i].u, &arr[i].v, &arr[i].val); 50 sort(arr, arr + m); 51 scanf("%d", &Q); 52 while (Q--){ 53 scanf("%d%d", &u, &v); 54 int ans = INF; 55 for (int j = 0; j < m; ++j){ 56 init(); 57 for (int k = j; k < m; ++k){ 58 Union(arr[k].u, arr[k].v); 59 if (find(u) == find(v)){ 60 ans = min(ans, arr[k].val - arr[j].val); //使ans盡可能的小 61 break; 62 } 63 } 64 } 65 if (ans == INF) 66 printf("-1\n"); 67 else 68 printf("%d\n", ans); 69 } 70 } 71 //system("pause"); 72 return 0; 73 }

hdu1598 find the most comfortable road 枚舉+最小生成樹