这次的组队赛用上了通过并查集来判断树的构成情况的题目,先做这道题练练;
#include<iostream>
#include<cstdio>
#include<string>
#define maxn 100010
using namespace std;
int fa[maxn];
int mark[maxn];
int find(int x)
{
return fa[x]==x?x:find(fa[x]);
}
void Union(int a,int b)
{
int x=find(a);
int y=find(b);
if(x!=y) fa[a]=b;;
}
int main()
{
int m,n;
while(scanf("%d%d",&m,&n))
{
if(m==-1&&n==-1) break;
if(m==0&&n==0)
{
cout<<"Yes"<<endl;
continue;
}
for(int i=0;i<maxn;i++)
{
mark[i]=0;
fa[i]=i;
}
Union(m,n);
mark[m]=mark[n]=1;
int flag=1;
while(scanf("%d%d",&m,&n))
{
if(m==0&&n==0) break;
int x=find(m);
int y=find(n);
if(x==y) flag=0;
else Union(x,y);
mark[m]=mark[n]=1;
}
if(!flag) cout<<"No"<<endl;
else
{
for(int i=0;i<maxn;i++)
if(mark[i]&&fa[i]==i) flag++;
if(flag==2) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}}
return 0;
}