整个文件以两个-1结尾。
6 8 5 3 5 2 6 4 5 6 0 0 8 1 7 3 6 2 8 9 7 5 7 4 7 8 7 6 0 0 3 8 6 8 6 4 5 3 5 6 5 2 0 0 -1 -1
Yes Yes No
#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; //flag决定是否成立,当相等时,说明成环了
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 }