您的位置:首页 > 其它

HDU 1272 小希的迷宫 并查集问题

2015-04-21 16:08 232 查看
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=66964#problem/M

题意:小希的迷宫问题,任意两个房间的连通问题,就是一个集合问题,应该说是一个不错的并查集模型,这里的的注意,”有且只有“的关键词,所以的判断连通分量。

代码:
#include<iostream>
#include<cstring>
#include<cstdio>

using namespace std;

int pre[100010],vis[100010];

int find(int x){
int t=x;
while(t!=pre[t]) t=pre[t];
while(x!=t) pre[x]=t,x=pre[x];
return t;
}

int main(){
//freopen("D:\\in.txt","r",stdin);
int a,b;
while(cin>>a>>b){
if(a==-1 && b==-1) break;
if(!a && !b) {printf("Yes\n");continue;}
memset(vis,0,sizeof(vis));
for(int i=0;i<=100000;i++) pre[i]=i;
pre[find(a)]=find(b);
vis[a]=vis[b]=1;
int op=1;
while(scanf("%d %d",&a,&b)){
if(!a && !b) break;
if(find(a)==find(b)) op=0;
if(op) pre[find(a)]=find(b),vis[a]=vis[b]=1;
}
int cnt=0;
if(op) for(int i=1;i<=100000;i++) {//判断连通分量
if(vis[i] && pre[i]==i) cnt++;
if(cnt==2) {op=0;break;}
}
printf("%s\n",op? "Yes":"No");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: