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 }

 

posted @ 2012-02-18 21:10  笑巧  阅读(3980)  评论(0编辑  收藏  举报