树 除了空树外,有且仅有一个根结点,且除根结点外,其余结点有且仅有一个前驱
判断图是否为树,则需判断它们的公共祖先是否仅有一个,且入度都小于2,并且不能形成环
#include<stdio.h>
#define N 1000
int f[N+10],t[N+10],c[N+10];
int find(int a)
{
if(a!=f[a])
f[a]=find(f[a]);
return f[a];
}
int mix(int a,int b)
{
int x,y;
x=find(a);
y=find(b);
if(x==y)
return 0;
f[x]=y;
return 1;
}
int main()
{
int i,j=0,n,m,a,b,flag;
while(scanf("%d%d",&m,&n)!=EOF){
if(m<0&&n<0) //当输入两个负数时结束
break;
j++;
if(m==0&&n==0){
printf("Case %d is a tree.\n",j);
continue;
}
for(i=1;i<=N;i++){
f[i]=i;
c[i]=t[i]=0;
}
flag=1;
while(m!=0&&n!=0){
t[m]=t[n]=1;
c[n]++; //计算入度
if(c[n]>1)
flag=0;
a=mix(m,n); //判断是否会形成环
if(!a)
flag=0;
scanf("%d%d",&m,&n);
}
if(flag){
b=0;
for(i=1;i<=N;i++){
if(t[i]&&f[i]==i)
b++; //计算根结点数目
if(b>1)
break;
}
}
if(flag&&b==1)
printf("Case %d is a tree.\n",j);
else
printf("Case %d is not a tree.\n",j);
}
return 0;
}