http://acm.hdu.edu.cn/showproblem.php?pid=1272

小希的迷宫 使用并查集求解。

  1. //小希的迷宫    
  2. //*****并查集*****  
  3. #include<stdio.h>  
  4. #define N 100001  
  5. int parent[N];  
  6. int height[N];  
  7. int get_parent(int v)  
  8. {  
  9.     while (parent[v] != v)  
  10.     {  
  11.         v = parent[v];  
  12.     }  
  13.     return v;  
  14. }  
  15.  
  16. void main()  
  17. {  
  18.     int u, v;  
  19.     int i;  
  20.     int temp1, temp2;  
  21.     int flag, count;  
  22.     while (scanf("%d%d", &u, &v) != EOF && !(u == -1 && v == -1))  
  23.     {  
  24.         if (u == 0 && u == 0)  
  25.         {  
  26.             printf("Yes\n");  
  27.             continue;  
  28.         }  
  29.         for (i = 1; i < N; i++)  
  30.         {  
  31.             parent[i] = i;  
  32.             height[i] = 1;  
  33.         }  
  34.         flag = 0;  
  35.         if (u == v)  
  36.             flag = 1;  
  37.         else 
  38.         {  
  39.             parent[v] = u;  
  40.             height[u]++;  
  41.         }  
  42.         while (scanf("%d%d", &u, &v) != EOF && !(u == 0 && v == 0))  
  43.         {  
  44.             temp1 = get_parent(u);  
  45.             temp2 = get_parent(v);  
  46.             if (temp1 == temp2 || flag == 1)  
  47.                 flag = 1;  
  48.             else 
  49.             {  
  50.                 if (height[temp1] > height[temp2])  
  51.                     parent[temp2] = temp1;  
  52.                 else 
  53.                 {  
  54.                     if (height[temp1] == height[temp2])  
  55.                     {  
  56.                         parent[temp2] = temp1;  
  57.                         height[temp1]++;  
  58.                     }  
  59.                     else 
  60.                         parent[temp1] = temp2;  
  61.                 }  
  62.             }  
  63.         }  
  64.         count = 0;  
  65.         for (i = 1; i < N; i++)  
  66.         {  
  67.             if (i == parent[i] && height[i] != 1)  
  68.                 count++;  
  69.         }  
  70.         if (count <= 1 && flag == 0)  
  71.             printf("Yes\n");  
  72.         else 
  73.             printf("No\n");  
  74.     }  
  75. }