題目大意
給你幾個點的連接情況,問你這些點能否連接成一棵樹。
思路
連接成一棵樹的條件有(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;
}