hdu 1272 小希的迷宫
https://vjudge.net/problem/HDU-1272
思路:
被这题卡了半天,妈的智障。
首先,还是没有仔细审题的问题,这题抽象出来就是判断一个图是否为无环的只有一个连通分量的图。直接用并查集做就好了。谨记审题仔细。
1 #include <stdio.h> 2 #include <string.h> 3 4 int par[200005]; 5 int ran[200005]; 6 bool v[100005]; 7 8 void init(void) 9 { 10 for (int i = 0;i < 200005;i++) 11 par[i] = i; 12 } 13 14 int fin(int x) 15 { 16 if (x == par[x]) 17 return x; 18 else 19 return par[x] = fin(par[x]); 20 } 21 22 bool unit(int x,int y) 23 { 24 x = fin(x); 25 y = fin(y); 26 27 if (x == y) return 0; 28 29 if (ran[x] < ran[y]) 30 { 31 par[x] = y; 32 } 33 else 34 { 35 par[y] = x; 36 37 if (ran[x] == ran[y]) ran[x]++; 38 } 39 40 return 1; 41 } 42 43 int main() 44 { 45 while (1) 46 { 47 memset(par,0,sizeof(par)); 48 memset(ran,0,sizeof(ran)); 49 memset(v,0,sizeof(v)); 50 51 bool f = 0,fa = 0; 52 53 int ma = 0; 54 55 init(); 56 57 int a,b; 58 59 while (scanf("%d%d",&a,&b) == 2) 60 { 61 if (a == -1 && b == -1) 62 { 63 f = 1; 64 break; 65 } 66 67 if (a * b == 0) break; 68 69 v[a] = 1;v[b] = 1; 70 71 if (b > ma) ma = b; 72 if (a > ma) ma = a; 73 74 if (!unit(a,b)) 75 { 76 fa = 1; 77 } 78 79 } 80 81 if (f) break; 82 83 if (fa) 84 { 85 printf("No\n"); 86 } 87 else 88 { 89 int rt = fin(ma); 90 91 bool ff = 0; 92 93 for (int i = 1;i <= ma;i++) 94 if (v[i] && fin(i) != rt) ff = 1; 95 96 if (ff) printf("No\n"); 97 else printf("Yes\n"); 98 } 99 100 } 101 102 return 0; 103 }
康复训练中~欢迎交流!