题目大意
给你几个点的连接情况,问你这些点能否连接成一棵树。
思路
连接成一棵树的条件有(1)不能有环(2)只有一个根节点,不然就是森林了。
那么我们其实只要用并查集依次把那些点连接起来,再通过连接两个点判断其是否有同一个根节点,如果有的话,那么就会形成环状回路,肯定不行。
在连接完成之后再去判断所有的结点中根节点的个数,如果个数不止一个,那就是森林了,就不是一棵树了,肯定也不行啦。
当然还有一点要注意空树也是树。
代码如下:
#include<stdio.h>
#include<string.h>
int pre[1005];
int find(int x)
{
while(pre[x]!=x)
{
x=pre[x];
}
return x;
}
int mix(int x,int y)
{
int fx=find(x),fy=find(y);
if(fx!=fy)
{
pre[fy]=fx;
}
}
int main()
{
int cnt=1,a,b,flag;
while(1)
{
flag=0;
while(~scanf("%d%d",&a,&b)&&a&&b)
{
if(a==-1&&a==-1)return 0;
if(pre[a]==0)pre[a]=a;
if(pre[b]==0)pre[b]=b;
if(find(a)==find(b))flag=1;
if(flag!=1)
{
mix(a,b);
}
}
int sum=0;
for(int i=1;i<=1005;i++)
{
if(pre[i]==i) sum++;
pre[i]=0;
}
if(sum>1||flag==1)printf("Case %d is not a tree.\n",cnt++);
else printf("Case %d is a tree.\n",cnt++);
}
return 0;
}