根据树的特点:
要注意的问题就是:0 0 是棵树
用结构体,分别记录标记、入度和根
然后就分别判断:
不要产生环的情况
不要入度大于1的情况
不要多根的情况
#include<stdio.h>
const int max_num = 100000 + 10;
typedef struct {
int num,root,conn;
}Node;
Node node[max_num];
void init()
{
for(int i=0;i<max_num;i++){
node[i].conn=0;
node[i].root=i;
node[i].num=0;
}
}
int find_root(int a){
if(node[a].root!=a)
return node[a].root = find_root(node[a].root);
return node[a].root;
}
void union_set(int a,int b){
a = find_root(a);
b = find_root(b);
if(a == b) return ;
node[b].root = a;
}
int main()
{
int n,m;
int i=1;
bool flag = true;
init();
while(scanf("%d%d",&n,&m)!=EOF&&n>=0&&m>=0){
if(!flag&&n!=0&&m!=0) continue;
if(n==0&&m==0){
int root_num=0;
for(int j=1;j<max_num;j++){
if(node[j].num && find_root(j)==j)
root_num++;
if(node[j].conn>1){
flag =false;
break;
}
}
if(root_num > 1)
flag = false;
if(flag)
printf("Case %d is a tree.\n",i++);
else printf("Case %d is not a tree.\n",i++);
flag = true;
init();
continue;
}
if(m!=n&&find_root(n)==find_root(m))
flag = false;
else
{
node[m].num = 1;
node[n].num = 1;
node[m].conn++;
union_set(n,m);
}
}
return 0;
}