今天的一道训练题目,好像是要用并查集做。但是想了想感觉不用并查集也可以。
题目地址:
http://acm.hdu.edu.cn/showproblem.php?pid=1325
我的思路:
考虑到如果出现以下两种情况则不为树:
1.同一个节点被指向两次。
2.出现两个及两个以上未被指向的节点。
现在构建两个数组a,b,其中a[i]表示i节点的出度,b[i]表示i节点的入度。
则不为树的情况即:
1.存在b[i]>=2 ;
2..存在两个及两个以上节点a[i]>=1且b[i]=0;
当然还需要注意一些特殊的情况:
0 0 空树 是树
1 1 0 0 不是树
1 2 2 3 3 1 0 0 环形 不是树
一开始没有考虑到这些情况wrong了好多次。
#include<stdio.h>
int a[1000005];
int b[1000005];
main()
{
int x,y,f,i,k,c=0;
while(1)
{
for(i=0;i<100005;i++)
{
b[i]=0;
a[i]=0;
}
f=k=0;
while(1)
{
scanf("%d%d",&x,&y);
if(x+y==0) break;
if(x+y<0) return 0;
if(x==y) f=1;
a[x]++;
b[y]++;
}
for(i=0;i<100005;i++)
{
if (b[i]>=2) f=1;
if (a[i]>=1&&b[i]==0) k++;
}
if(f==1||k>1) printf("Case %d is not a tree.\n",++c);
else printf("Case %d is a tree.\n",++c);
}
}