hdu1325

判断有向根树,并查集,用两个数组,一个bin记录父结点,一个flag记录是否为已有父结点,
用一个数k来标记是否为有向根树。明显,
1.在边的输入过程中如果出现已有父亲结点的点为子结点,则这一定不是有向根树
2.在输入完成后,要检查是否只有一个根结点
就满足这两点,在oj上水过~~了
在与队友的交流中发现时因为数据水的缘
应该需要加一个判断是否有连通分支为圈的情况,考虑不够周全吖!!!

#include<iostream>
int bin[100005],flag[100005],k;
int find(int x)
{
while(bin[x]!=x)
x=bin[x];
return x;
}
int merge(int x,int y)
{
if(flag[y]==0)
{
bin[y]=x;
flag[y]=1;
}
else
{
k=0;
}
return 0;
}
int main(){
int n,i,x,y,root;
n=1;
while(scanf("%d %d",&x,&y)&&(x>=0&&y>=0))
{
k=1;root=0;
for(i=1;i<=100000;i++)
{
bin[i]=i;
flag[i]=0;
}
if(x==0&&y==0)
printf("Case %d is a tree.\n",n++);
else
{
do
{
merge(x,y);
}
while(scanf("%d %d",&x,&y)&&(x!=0&&y!=0));
if(k==1)
{
for(i=1;i<=100000;i++)
{
if(bin[i]!=i&&flag[bin[i]]==0)
flag[bin[i]]=1;
}
for(i=1;i<=100000;i++)
{
if(bin[i]==i&&flag[i]==1)
root++;
}
if(root==1)
printf("Case %d is a tree.\n",n++);
else
printf("Case %d is not a tree.\n",n++);
}
else
printf("Case %d is not a tree.\n",n++);
}
}
return 0;
}

 

你可能感兴趣的:(记录)