您的位置:首页 > 其它

HDU 1272 小希的迷宫

2013-04-16 10:55 423 查看
(1) 判断是否有回路,这个可以用并查集来做,一旦给定的两个节点a,b是属于同一个集合,那么便可以判定有回路

(2)看是否只有一个联通分支,这个可以用并查集来做,最终并查集只有一个根节点

#include <iostream>
#include <cstdio>
#include <cstring>

#define MAX 100000 + 5
using namespace std;

int parent[MAX];
bool used[MAX];

void Make_Set(){
for(int i = 0; i < MAX; i ++ ) parent[i] = i;
}

int Find_Set(int x){
return parent[x] == x ? x : (parent[x]=Find_Set(parent[x]));
}

bool Union_Set(int x,int y){
int a = Find_Set(x), b = Find_Set(y);
if( a == b) return false;
else{
parent[a] = b;
return true;
}
}

int main(){
while(1){
bool isExit = false, isLoop = false;
int a,b;
memset(used,false,sizeof(used));
Make_Set();
while(cin >> a >> b && a && b){
if(a == -1 || b == -1) {isExit  =true;break;}
used[a] = true; used[b] = true;
if(!Union_Set(a,b)) isLoop = true;
}
if(isExit) break;
else if(isLoop) cout<<"No"<<endl;
else{
int cnt = 0;
for(int i = 0 ;i < MAX; i ++ ){
if(used[i] && i == Find_Set(i)) cnt++;
}
if(cnt == 1 || cnt == 0) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: