判断是否构成一棵树。
并查集,判断所有的点的根是否相同就行了。
#include<iostream>
#include<cstdio>
#include<cstring>
#define N 100010
using namespace std ;
int father[N];
bool vis[N];
void Init()
{
for(int i=0;i<=N;i++){
father[i]=i;
vis[i]=0;
}
}
int find(int x)
{
if(x==father[x]) return x;
else return find(father[x]);
}
int main()
{
int a,b,fa,fb,root;
Init();
int tes=1;
while(scanf("%d %d",&a,&b),a>=0&&b>=0){
if(a==0&&b==0){
printf("Case %d is a tree.\n",tes++);
continue;
}
root=a;
bool flag=1;
if(a==b) flag=0;
else father[b]=a;
vis[a]=vis[b]=1;
while(scanf("%d %d",&a,&b),(a||b)){
vis[a]=vis[b]=1;
fa=find(a);
fb=find(b);
if(fa==fb) flag=0;
else father[fb]=fa;
}
if(flag){
root=find(root);
for(int i=0;i<=N;i++){
if(vis[i]&&find(i)!=root){
flag=0;
break;
}
}
if(flag) printf("Case %d is a tree.\n",tes++);
else printf("Case %d is not a tree.\n",tes++);
}
else printf("Case %d is not a tree.\n",tes++);
Init();
}
}