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 }

 

你可能感兴趣的:(HDU)