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==-1) break;
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==0) break;
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 }
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==-1) break;
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==0) break;
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 }