您的位置:首页 > 其它

HDU 1325 Is It A Tree?

2014-02-11 20:32 351 查看
题解:首先,是一棵树的话要满足的条件是

1  不成环;
2  除了根,所有的入度为1,根入度为0;
3  只有一棵树,不是森林


那么,用并查集记录父亲,如果矛盾就成环,而最后找到一个节点的父亲,如果其余的不是则为森林,而入度则在开始时记一下,最后发现如果有入度大于1的则也不行。

#include <cstdio>
#include <iostream>
using namespace std;
const int MAXN=100010;
int f[MAXN],flag,hash[MAXN],in[MAXN];
void init(){
flag=1;
for(int i=1;i<MAXN;i++){f[i]=i;in[i]=0;hash[i]=0;}
}
int sf(int x){
if(x!=f[x])f[x]=sf(f[x]);
return f[x];
}
int main(){
int cnt=1,root,x,y;
init();
while(scanf("%d%d",&x,&y)){
if(x<0&&y<0)break;
if(x==0&&y==0){
if(flag){
for(int i=1;i<MAXN;i++){if(hash[i]){root=sf(i);break;}}
for(int i=1;i<MAXN;i++){
if(in[i]>1){flag=0;break;}
if(hash[i]&&root!=sf(i)){flag=0;break;}
}
}
if(flag)printf("Case %d is a tree.\n",cnt++);
else printf("Case %d is not a tree.\n",cnt++);
init();
}else{
if(sf(x)==sf(y))flag=0;
if(!flag)continue;
hash[x]=hash[y]=1;
in[x]++;
f[sf(x)]=sf(y);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: