您的位置:首页 > 其它

kuangbin专题五 并查集 HDU1272 小希的迷宫

2017-12-12 18:09 387 查看
题意:

中文题

题解:

任意两个房间有且仅有一条路径可以相通,可以用并查集来做,如果输入的两个房间号的祖宗是一样的话,就说明,成环了,输出No,还有一种情况是不成环,森林的情况,比如:

1 2 3 4 0 0

正确的输出为No。

只要在最后跑一边for循环检查是否出现两个祖宗就可以知道是否出现森林了。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int MAXN=1e5+7;
int f[MAXN];
bool vis[MAXN];
void init()
{
for(int i=0;i<=1e5;i++)
f[i]=i;
}
int find(int p)
{
while(p!=f[p])
{
f[p]=f[f[p]];
p=f[p];
}
return p;
}
bool Union(int p,int q)
{
int P=find(p);
int Q=find(q);
if(P==Q)
return true;
else
{
f[Q]=P;
}
return false;
}
int main()
{
int n;
while(1)
{
int a,b,MAX=0;
init();
memset(vis,false,sizeof(vis));
bool mark=false,ans=false;
while(~scanf("%d%d",&a,&b))
{
if(a==-1&&b==-1)
{
mark=true;
break;
}
MAX=max(max(MAX,a),b);
vis[a]=true;
vis[b]=true;
if(a==0&&b==0)
break;
if(Union(a,b))
ans=true;
}
in
4000
t sum=0;
for(int i=1;i<=MAX;i++)
if(vis[i]&&f[i]==i)
sum++;
if(mark)
break;
if(ans||sum>1)
printf("No\n");
else
printf("Yes\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: