


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
Case 1 is a tree. Case 2 is a tree. Case 3 is not a tree.
#include<stdio.h>
#define maxn 100000 + 6
int tree[maxn],bj[maxn]; //数组e的元素值等于当前序号父级的序号,不一定是树的根
int find(int x)
{ //找树根
if(tree[x]==x)
return x;
else
return find(tree[x]);
}
int main()
{
int i,j,k;
int t,n,m;
int x,y,num;
int w=0;
while(scanf("%d%d",&m,&n)!=EOF)
{
if(m<0&&n<0)
break;
t=0;
w++;
if(!(m||n))
printf("Case %d is a tree.\n",w);
else
{
for(i=1;i<=maxn;i++)
{
tree[i]=i;
bj[i]=0;
}
tree[n]=m;
bj[m]=bj[n]=1;
while(scanf("%d%d",&m,&n)!=EOF&&(m||n))
{
x=find(m);
y=find(n);
if(x==y)
t=1; //判断是否是环
else
tree[n]=m; //即使存在元素更改了父级也不影响树的个数
bj[m]=bj[n]=1;
}
if(t==1)
printf("Case %d is not a tree.\n",w);
else
{
num=0;
for(i=1;i<=maxn;i++)
{
if(bj[i]==1&&tree[i]==i) //统计树根个数,为1时才符合题意
{
num++;
if(num>1)
break;
}
}
if(num>1)
printf("Case %d is not a tree.\n",w);
else
printf("Case %d is a tree.\n",w);
}
}
}
return 0;
}#include "stdio.h"
#include<iostream>
#define m 100001
using namespace std;
int main()
{
int i,j,k;
int a,b,flag;
int tree[m];
int v[m];
int ans=1,flag2;
while(cin>>a>>b)
{
if(a<0&&b<0)
break;
flag=0;
flag2=0;
memset(tree,0,m-1);
memset(v,0,m-1);
int e=0;
while(a&&b)
{
flag2=1;
if(!v[a])
{
v[a]=1;
e++;
}
if(!v[b])
{
v[b]=1;
e++;
}
e--;
if(tree[b]==0)//b is root
tree[b]=1;
else
{
flag=1;
break;
}
cin>>a>>b;
}
while(a&&b)
{
scanf("%d %d",&a,&b);
}
if((!flag&&e==1)||flag2==0)
printf("Case %d is a tree.\n",ans);
else
printf("Case %d is not a tree.\n",ans);
ans++;
}
return 0;
}Is It A Tree?------HDOJ杭电1325(两种方法,可以用也可以不用并查集!!!!!!详解),布布扣,bubuko.com
Is It A Tree?------HDOJ杭电1325(两种方法,可以用也可以不用并查集!!!!!!详解)
原文地址:http://blog.csdn.net/u014231159/article/details/26401093