传送门:
http://acm.hdu.edu.cn/showproblem.php?pid=1272
并查集知识点传送门:
http://blog.csdn.net/dellaserss/article/details/7724401/
了解并查集后就可以直接看代码了
#include<stdio.h>
#define MAX 100005
int count,e,quan;//这里的count记录有多少个房间走过,e记录有几条边,quan表示有无环
int v[MAX];
struct Node
{
int parents;
}node[MAX];
int find(int x)
{
if(x==node[x].parents)
return x;
return find(node[x].parents);
}
void Union(int a,int b)
{
int A,B;
v[a]=v[b]=1;
A=find(a);
B=find(b);
if(A!=B)
{
node[A].parents=B;
e++;
}
else
{
quan=1;
}
}
int main()
{
int a,b,i;
while(1)
{
count=0;
e=0;
quan=0;
scanf("%d %d",&a,&b);
if(a==-1&&b==-1)
return 0;
if(a==0&&b==0)
{
printf("Yes\n");
continue;
}
for(i=0;i<MAX;i++)//初始化
{
node[i].parents=i;
v[i]=0;
}
Union(a,b);
while(1)
{
scanf("%d %d",&a,&b);
if(a==0&&b==0)
break;
Union(a,b);
}
for(i=0;i<MAX;i++)
{
if(v[i]==1)
count++;
}
if(quan==0&&count==e+1)//欧拉公式,面+点=线+2,这里因为是连通图,所以面个数为1,两边消去,就是 点=线+1
printf("Yes\n");
else
printf("No\n");
}
return 0;
}