1》判斷成環的時候,只要判斷輸入邊的兩個點。有一個共同的父節點,那么這兩個點就成環。
2》判斷連通的時候,只要判斷根節點數為1即可。
注意:當輸入的這組數據只有 0 0 時,依然是滿足條件的,即應輸出 "Yes"。

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 }