http://acm.hdu.edu.cn/showproblem.php?pid=1272
思路:
所求的图满足两点要求:(1) 连通 (2) 不存在环 。
而这两点用并查集都能判断。注意本题中 输入 0 0时,应输出 Yes。
1 #include <stdio.h> 2 #include <string.h> 3 const int N=100002; 4 int f[N],vis[N]; 5 void init() 6 { 7 for (int i = 1; i <= N; i ++) 8 { 9 f[i] = i; 10 vis[i] = 0; 11 } 12 13 } 14 int find(int x) 15 { 16 if (x!=f[x]) 17 f[x] = find(f[x]); 18 return f[x]; 19 } 20 void merge(int x,int y) 21 { 22 x = find(x); 23 y = find(y); 24 if (x!=y) 25 f[x] = y; 26 } 27 int main() 28 { 29 int u,v; 30 while(1) 31 { 32 int cnt = 0; 33 int flag = 1; 34 init(); 35 while(~scanf("%d%d",&u,&v)) 36 { 37 if (u==0&&v==0||u==-1&&v==-1) 38 break; 39 vis[u] = 1; 40 vis[v] = 1; 41 if(find(u)==find(v))//判环 42 { 43 flag = 0; 44 } 45 else 46 merge(u,v); 47 } 48 if (u==-1&&v==-1) 49 break; 50 for (int i = 0; i <= N; i ++)//判连通性 51 { 52 if (vis[i]&&f[i]==i) 53 cnt ++; 54 } 55 if (cnt<=1&&flag) 56 printf("Yes "); 57 else 58 printf("No "); 59 } 60 return 0; 61 }