题意:给你一些点的关系,判断他们能否组成一棵树
组成树的条件
1.根节点只有一个。
2.不能有环。
在合并的时候判断环,合并完成后,遍历每个节点看其父亲是否相同,都相同说明只有一个节点,否则不是树。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int father[100000];
int f[100000];
int ff[100000];
int flag = 0;
void Make_set(int n)
{
int i;
for(i = 0; i < n; i++)
{
father[i] = i;
}
}
int Find_set(int x)
{
if(x != father[x])
{
father[x] = Find_set(father[x]);
}
return father[x];
}
void Union(int a,int b)
{
int x = Find_set(a);
int y = Find_set(b);
if(x == y)
{
flag = 1;
return ;
}
else
{
father[y] = x;
}
}
int main()
{
int a,b,cas = 1;
while(scanf("%d%d",&a,&b) != EOF)
{
Make_set(100000);
if(a < 0 && b < 0)
{
break;
}
else
{
flag = 0;
Union(a,b);ff[a] = 1,ff[b] = 1;
int i;
int sum = 1;
while(scanf("%d%d",&a,&b) != EOF)
{
if(a == 0 && b == 0)
break;
ff[a] = 1,ff[b] = 1;
Union(a,b);sum++;
}
memset(f,0,sizeof(f));
printf("Case %d ",cas++);
if(flag)
{
printf("is not a tree.\n");
}
else
{
int i,count = 0;
for(i = 0; i < 100000; i++)
{
if( ff[i] && !f[Find_set(i)])
{
f[Find_set(i)] = 1;
count++;
}
if(count == sum )
break;
}
if(count > 1)
printf("is not a tree.\n");
else
printf("is a tree.\n");
}
}
}
return 0;
}