题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272

  1. #include<iostream> 
  2. using namespace std;  
  3.  
  4. const int MAX_VETEX_NUM = 100001;  
  5. bool flag[MAX_VETEX_NUM];  
  6. int connectedList[MAX_VETEX_NUM];  
  7. bool isOk = true;  
  8. int nStart,nEnd;  
  9.  
  10. void initConnectedList()  
  11. {  
  12.     for (int i = 0; i < MAX_VETEX_NUM; ++i)  
  13.     {      
  14.         connectedList[i] = i;  
  15.         flag[i] = false;  
  16.     }  
  17. }  
  18. int findInConnectList(int vetex)  
  19. {  
  20.     int pos = vetex;  
  21.     while(pos != connectedList[pos])  
  22.        {  
  23.         pos = connectedList[pos];  
  24.     }  
  25.     return pos;  
  26. }  
  27. int countListNum()  
  28. {  
  29.     int count = 0;  
  30.     for (int i = 0; i < MAX_VETEX_NUM; ++i)  
  31.     {  
  32.         if (flag[i] == true)  
  33.         {  
  34.             if (findInConnectList(i) == i)  
  35.             {  
  36.                 ++count;  
  37.             }  
  38.         }  
  39.     }  
  40.     return count;  
  41. }  
  42.  
  43. void process()  
  44. {  
  45.     if( findInConnectList(nStart) == findInConnectList(nEnd))  
  46.     {  
  47.            isOk = false;  
  48.            return;  
  49.     }  
  50.     if( findInConnectList(nStart) == nStart && findInConnectList(nEnd) == nEnd)  
  51.        {  
  52.         connectedList[nEnd] = nStart;  
  53.     }      
  54.     else if(findInConnectList(nStart) == nStart)  
  55.        {  
  56.         connectedList[nStart] = findInConnectList(nEnd);  
  57.     }  
  58.     else   
  59.        {  
  60.         connectedList[nEnd] = findInConnectList(nStart);  
  61.     }  
  62.     flag[nStart] = true;  
  63.     flag[nEnd] = true;  
  64. }  
  65. int main()  
  66. {  
  67.     while(cin >> nStart >> nEnd)  
  68.     {  
  69.            if(nStart == -1 && nEnd == -1) break;  
  70.            if(nStart || nEnd)  
  71.            {  
  72.             isOk = true;  
  73.             memset(flag, false ,sizeof(flag));  
  74.             initConnectedList();  
  75.             process();  
  76.             while(cin >> nStart >> nEnd,nStart || nEnd)  
  77.             {  
  78.                if(isOk == true)    
  79.                {  
  80.                    process();  
  81.                }  
  82.                }  
  83.             if(isOk == true) // 如果没有回环,也有可能在不同连通分量中  
  84.             {  
  85.                 int count = 0;   
  86.                 count = countListNum();  
  87.                  if(count>1)  
  88.                   {  
  89.                     isOk = false;  
  90.                 }  
  91.             }  
  92.            }  
  93.            else  
  94.            {  
  95.             isOk = true;  
  96.            }  
  97.            if(isOk == false)  
  98.         {  
  99.             cout << "No" << endl;  
  100.         }  
  101.            else  
  102.         {  
  103.             cout << "Yes" << endl;  
  104.         }  
  105.     }  
  106.     return 0;