HDU1272(並查集)


解題思路: 題目意思是找到判斷是不是連通無環的圖,首先想到的就是並查集。

              1》判斷成環的時候,只要判斷輸入邊的兩個點。有一個共同的父節點,那么這兩個點就成環。

              2》判斷連通的時候,只要判斷根節點數為1即可。

             注意:當輸入的這組數據只有 0 0 時,依然是滿足條件的,即應輸出 "Yes"。

View Code
 1 #include<iostream>
 2  using  namespace std;
 3  #define MAX 100005
 4  int father[MAX],flag,sign[MAX];
 5 
 6  int FindSet( int x)
 7 {
 8      while(x!=father[x])
 9         x=father[x];
10      return x;
11 }
12 
13  void Union( int x, int y)
14 {
15     x=FindSet(x);
16     y=FindSet(y);
17      if(x!=y)
18         father[x]=y;
19      else flag= 0// 同父節點,成環
20  }
21 
22  int main()
23 {
24      int i,a,b;
25      while(cin>>a>>b)
26     {
27          if(a==- 1&&b==- 1break;
28          if(a== 0&&b== 0)
29         { cout<< " Yes "<<endl;  continue; }
30          for(i= 1;i<MAX;i++) 
31         {
32             father[i]=i;
33             sign[i]= 0;
34         }
35         sign[a]=sign[b]= 1;
36         flag= 1;
37         Union(a,b);
38          while(cin>>a>>b)
39         {
40              if(a== 0&&b== 0break;
41             Union(a,b);
42             sign[a]=sign[b]= 1;
43         }
44          int k= 0;
45          for(i= 1;i<MAX;i++)
46         {
47              if(sign[i]&&father[i]==i)  // 判斷根節點k數目
48                  k++; 
49              if(k> 1) flag= 0;
50         }
51          if(flag) cout<< " Yes "<<endl;
52          else cout<< " No "<<endl;
53     }
54      return  0;
55 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM