并查集
开始没有判断是否成环,死循环了好久。
struct node{
int parent,num;
}tree[MAX];
int vis[MAX]={};
int E,T; //E 节点数, T 指示是否成树。
void get(int x,int& f){
int r=x,count=0;
while(r!=tree[r].parent){
if(count>E) {//避免成环时死循环
T=0;break;
}
else count++;
r=tree[r].parent;
}
f=r;
}
int main(void)
{
int a,b,Case=1;
while(1){
E=0;memset(vis,0,sizeof(vis));
T=1 ;int cur=0;//表示是树;
while(scanf("%d%d",&a,&b)){
if(a<0&&b<0) goto end2;
if(!(a||b)) goto end1;
if(!T) continue;
if(a==b) {T=0;}
if(!vis[a]) vis[a]=1,E++,tree[a].parent=a,tree[a].num=1;//初始化
if(!vis[b]) vis[b]=1,E++,tree[b].parent=b,tree[b].num=1;
int fa,fb;cur=a;
get(a,fa);get(b,fb);
if(b==fb){//只要b无父 就 把 b 连到 a 上。
tree[b].parent=a;
tree[fa].num+=tree[b].num;//记录以该节点为根的树有多少节点。
//printf("%d连%d成功\n",a,b);
}
else T=0;
}
end1:
get(cur,cur);//随便找到一个节点的根节点
if(T&&tree[cur].num!=E) T=0;//如果根节点的节点数不等于总节点数,那么就不止一棵树,不符合条件,令T=0.
if(T) printf("Case %d is a tree.\n",Case++);
else printf("Case %d is not a tree.\n",Case++);
}
end2:
return 0;
}