标签:
小希的迷宫No
题解:这道题考察并查集的两个特点
1:判断是否属于同一个集合(可以判断是否有环(如果两者同属于一个集合则再进行联立就会有环存在))。
2:判断是否仅有一棵树(同一棵树中顶点的总和等于边数加一)。
采用book【】数组来判断点是否出现过,最后用点与边进行比较。
代码:
///HDU 1272 (小希的迷宫)
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
using namespace std;
const int maxx=100005;
int par[maxx];
int book[maxx];///记录点
///寻找根结点
int find(int x)
{
if(par[x]==x)
return x;
else
return par[x]=find(par[x]);
}
///合并集合
int unite(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx==fy)
return 0;
else
par[y]=x;
}
int main()
{ int x,y;
while(~scanf("%d %d",&x,&y))
{
if(!x&&!y)///特殊数据(当x==0&&y==0)时输出Yes
{
printf("Yes\n");
continue;
}
if(x==-1&&y==-1)
break;
///初始化根
for(int i=1;i<=maxx;i++)
par[i]=i;
memset(book,0,sizeof(book));
book[x]=book[y]=1;
int n=1;///点的个数
int flag=1;
while(~scanf("%d %d",&x,&y))
{
if(x==0&&y==0)
break;
if(book[x]==0)
{
n++;
book[x]=1;
}
if(book[y]==0)
{
n++;
book[y]=1;
}
if(unite(x,y))///如果两者不在同一个集合中,则合并(边)
{
n--; ///同一棵树边与点的个数相差1
}
else
flag=0;
}
if(flag&&n==1)///如果仅有一棵树且无环
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/jingttkx/article/details/51346965