您的位置:首页 > 其它

HDOJ 1308.Is It A Tree?

2015-07-27 14:44 295 查看
2015-07-15
问题简述:

  给出一组节点关系,判断由这些节点组成的图是否为一颗树。

  树只有一个根节点,每个节点只有一条边指向它,没有环。

  原题链接:http://poj.org/problem?id=1308

解题思路:

  使用并查集判断是否只有一个根节点是很简单的——让并查集种祖先的父亲是他自己即可方便计算其数量,一旦祖先数量超过一,它就不是树;

  也可使用并查集判断图是否有环——当两个即将要链接的节点都有相同的祖先时,这就产生了一个环。

源代码:

/*
OJ: POJ
ID: forever
TASK: 1308.Is It A Tree?
LANG: C++
NOTE: Find-Union
*/
#include <cstdio>

const int MAX=10005;
int father[MAX],sign[MAX],flag;

int Find(int x) {
if(father[x]==x)
return x;
else
return Find(father[x]);
}

void Union(int x,int y) {
x=Find(x);
y=Find(y);
if(x!=y)
father[x]=y;
else
flag=0;
}

int main()
{
int a,b,k=1;
while(scanf("%d %d",&a,&b)) {
if(a==-1&&b==-1) break;
if(a==0&&b==0) {
printf("Case %d is a tree.\n",k++);
continue;
}

flag=1;
int m=0;
for(int i=0;i<MAX;i++) {
father[i]=i;
sign[i]=0;
}
Union(a,b);
sign[a]=sign[b]=1;

while(scanf("%d %d",&a,&b)) {
if(a==0&&b==0) break;
if(a>m)
m=a;
if(b>m)
m=b;
Union(a,b);
sign[a]=sign[b]=1;
}
int sum=0;
for(int i=1;i<MAX;i++) {
if(sign[i]&&father[i]==i)
sum++;
if(sum>1) {
flag=0;
break;
}
}
if(flag)
printf("Case %d is a tree.\n",k++);
else
printf("Case %d is not a tree.\n",k++);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: