根据输入数据判断能否构造成一棵树,模拟太烦,用并查集做
#include<iostream>
#include<cstdio>
using namespace std;
int a,b,x,y,num=0,sum;
int sets[50000];
bool flag,nodes[50000],isnode[50000];
int findset(int x){
int y;
if(sets[x]==x) return x;
else y=findset(sets[x]);
sets[x]=y;
return y;
}
int main(){
while(1){
num++;
flag=true;
for(int i=0;i<50000;i++){
sets[i]=i;
nodes[i]=false;
isnode[i]=false;
}
scanf("%d%d",&a,&b);
if(a==-1&&b==-1) break;
while(1){
if(a==0&&b==0) break;
x=findset(a);
y=findset(b);
if(nodes[b]&&flag){
flag=false;
printf("Case %d is not a tree.\n",num);
}
if(x==y&&flag){
flag=false;
printf("Case %d is not a tree.\n",num);
}
else{
sets[x]=y;
nodes[b]=true;
isnode[a]=isnode[b]=true;
}
scanf("%d%d",&a,&b);
}
sum=0;
for(int i=0;i<50000;i++)
if(!nodes[i]&&isnode[i]) sum++;
if(sum!=1&&sum!=0){
flag=false;
printf("Case %d is not a tree.\n",num);
}
if(flag) printf("Case %d is a tree.\n",num);
}
return 0;
}