题目大意就是判断是否为一棵树?
成为一棵树的条件是:只有一个根节点、非根节点只有一个入度
这里要注意的是,空树也是树,森林不是树,1 1 0 0 不是树,自己不能指向自己
#include <iostream>
using namespace std;
#define MAX 105
int p[MAX];
bool flag[MAX];
int Find(int a){ //并查集,递归寻找根节点
return a==p[a]?a:a=Find(p[a]);
}
void Union(int a,int b){ //看是否成环
int x = Find(a);
int y = Find(b);
if(x!=y) p[y] = x;
}
int main(){
int x,y,i,first;
int t=1;
while(cin>>x>>y){
if(x == -1 && y == -1)
break;
if(x == 0&&y == 0){ //空树也是一棵树
cout<<"Case "<<t++<<" is a tree."<<endl;
continue;
}
for(i=0;i<MAX;i++){
p[i] = i; //初始化
flag[i] = false;
}
flag[x] = flag[y] = true;
first = x;
bool tree = true;
if(x == y) tree = false; //自己指向自己,不是一棵树
else{
Union(x,y);
}
while(cin>>x>>y,x!=0){
flag[x] = flag[y] = true;
if(Find(x) == Find(y)) //有共同祖先,x再指向y,就不是一棵树
tree = false;
Union(x,y);
}
for(i=0;i<MAX;i++){
if(flag[i]&&Find(i)!=Find(first)){ //森林不是一棵树
tree = false;
}
}
if(tree) cout<<"Case "<<t++<<" is a tree."<<endl;
else
cout<<"Case "<<t++<<" is not a tree."<<endl;
}
return 0;
}