hdu 1272 并查集
hdu 1272 小希的迷宫
题意:判断图是否连通且无环;
思路:输入边的两点,若两点的父节点相同,则存在环;只有一个根节点则图连通;当输入"0 0"时输出"Yes"
1 #include<cstdio> 2 #include<cstring> 3 4 int set[100000 + 50]; 5 bool visit[100000 + 50]; 6 bool flag; 7 int find(int x) 8 { 9 return x == set[x]?x:set[x] = find(set[x]); 10 } 11 12 void merge(int a, int b) 13 { 14 int i = find(a); 15 int j = find(b); 16 if(i != j) set[i] = j; 17 else flag = true; 18 visit[a] = visit[b] = true; 19 return ; 20 } 21 22 int main() 23 { 24 int a,b; 25 while(~scanf("%d%d",&a,&b)) 26 { 27 if(a == -1 && b == -1) break; 28 else if(a == 0 && b == 0) 29 { 30 printf("Yes\n"); 31 continue; 32 } 33 else 34 { 35 for(int i = 1; i <= 100000; i++) 36 set[i] = i; 37 merge(a,b); 38 } 39 while(scanf("%d%d",&a,&b) && (a||b)) 40 { 41 merge(a,b); 42 } 43 int num = 0; 44 for(int i = 1; i <= 100000; i++) 45 { 46 if(visit[i] && set[i] == i) num++; 47 } 48 if(!flag && num == 1) printf("Yes\n"); 49 else printf("No\n"); 50 flag = false; 51 memset(visit,0,sizeof(visit)); 52 } 53 return 0; 54 }