Description
Input
Output
Sample Input
6 8 5 3 5 2 6 4 5 6 0 0 8 1 7 3 6 2 8 9 7 5 7 4 7 8 7 6 0 0 3 8 6 8 6 4 5 3 5 6 5 2 0 0 -1 -1
Sample Output
Case 1 is a tree. Case 2 is a tree. Case 3 is not a tree.
解题思路:判断是否是树有三个条件:一、没有回路 二、只有一个根节点 三、除根外每个节点有且只有一条有向边指向它。(并查集)
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define MAXN 1000002
int p[MAXN];
int find(int x)
{
return p[x]==x ? x :(p[x]=find(p[x]));
}
int main()
{
int a,b,tree_num,t=0,father_a,father_b,TF;
while(~scanf("%d%d",&a,&b) && (a>=0||b>=0))
{
tree_num=TF=1;
if(a==0)
{
printf("Case %d is a tree.\n",++t);
continue;
}
if(a==b)
TF=0;
else
{
memset(p,0,sizeof(p));
p[a]=p[b]=a;
}
while(~scanf("%d%d",&a,&b) && a!=0)
{
if(TF==0 )
continue;
if(p[b]!=0)
{
father_b=find(b);
if(b!=father_b)
{
TF=0;
continue;
}
else
{
if(p[a]!=0)
{
p[b]=find(a);
tree_num--;
}
else
p[b]=p[a]=a;
}
}
else
{
if(p[a]==0)
{
p[a]=p[b]=a;
tree_num++;
}
else
p[b]=find(a);
}
}
printf("Case %d ",++t);
if(TF==0)
{
printf("is not a tree.\n");
continue;
}
if(tree_num==1)
printf("is a tree.\n");
else
printf("is not a tree.\n");
}
return 0;
}
原文:http://www.cnblogs.com/llfj/p/5696972.html