您的位置:首页 > 其它

hdu1272——小希的迷宫

2010-09-27 23:03 381 查看
记住:空树也是树!

这道题还要考虑形成森林的情况!

#include<stdio.h>
#include<string.h>
int tt[100005],num[100005],used[100005];
int find(int a)
{
int i,x;
x=a;
while(tt[x]!=x)
x=tt[x];
while(a!=tt[a])
{
i=tt[a];
tt[a]=x;
a=i;
}
return x;
}
void unin(int a,int b)
{
if(num[a]>num[b])
{
tt[b]=a;
num[a]+=num[b];
}
else
{
tt[a]=b;
num[b]+=num[a];
}
}
main()
{
int a,b,flag,i;
int f1,f2,nt;
for(i=0;i<100005;i++)
num[i]=1;
memset(used,0,sizeof(used));
for(i=0;i<100005;i++)
tt[i]=i;
flag=1;nt=0;
int first=0;
while(scanf("%d%d",&a,&b)!=EOF)
{
if(a==-1&&b==-1)
break;
if(a==0&&b==0)
{
if(first==0)
printf("Yes/n");
else
{
nt=0;
for(i=0;i<100005;i++)
if(used[i]&&tt[i]==i)
nt++;
if(flag&&nt==1)
printf("Yes/n");
else
printf("No/n");
}
for(i=0;i<100005;i++)
num[i]=1;
memset(used,0,sizeof(used));
nt=0;
for(i=0;i<=100004;i++)
tt[i]=i;
flag=1;first=0;
continue;
}
else
{
first=1;
f1=find(a);f2=find(b);
if(used[a]==0)
{used[a]=1;nt++;}
if(used[b]==0)
{used[b]=1;nt++;}
if(f1==f2)
{
flag=0;

}
else
unin(f1,f2);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: