hdu1272(并查集基础)

题目链接:点击打开链接

判断连通图中是否有回路,或者未连接的路。

虽说是水题并查集,可我怎么改都是错,最后发现,题目数据真是坑,0    0,有毛线意思,也不应该是YES啊。给跪了。


#include<stdio.h>

#include<string.h>
int v[100010];
int f[100010];//标志数组
int find(int x)
{
if(x!=v[x])
x=find(v[x]);
return x;


}
int make(int a,int b)
{
int aa,bb;
aa=find(a);
bb=find(b);
if(aa==bb)
return 0;
else
{
if(aa>=bb)
v[aa]=bb;
else
v[bb]=aa;
}
return 1;
}
int main()
{
int n,m,k,flag,j,max;
while(scanf("%d%d",&n,&m),n!=-1&&m!=-1)
{
if (n == 0 && m == 0 )
{  
printf("Yes\n");
continue;
}
         max=0;//找最大的数据
if(max<n)
max=n;
if(max<m)
max=m;
memset(f,0,sizeof(f));
memset(v,0,sizeof(v));
f[n]=1;
f[m]=1;
k=make(n,m);
flag=1;
while(scanf("%d%d",&n,&m),m+n)
{

if(max<n)
max=n;
    if(max<m)
max=m;
f[n]=1;
    f[m]=1;
if(v[n]==0)
v[n]=n;
if(v[m]==0)
v[m]=m;
k=make(n,m);
if(k==0)
 flag=0;
}
if(flag==0)
printf("No\n");
else
{
int count=0;
for(j=1;j<=max;j++)//遍历是否有未连接的房间
if(v[j]==0&&f[j]==1)
count++;
if(count==1)
printf("Yes\n");
else
printf("No\n");
}
}
return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_16707047/article/details/39780069
今日推荐