hdu1272小希的迷宫【并差集】

来源:互联网 发布:淘宝手机端网页版 编辑:程序博客网 时间:2024/06/05 13:08
#include <iostream>using namespace std;//题意:任意2个房间只能有一条路径,不能出现环//思路:1、n个节点只能有n-1条边,否则会出现环//      2、图必须是全连通图,只能有一个连通分量//      3、并差集#define NSIZ 100010int parent[NSIZ];int myrank[NSIZ];int flag[NSIZ];void make_set(int n){int i;memset(flag, 0, sizeof(flag));for(i = 1;i < n; ++i){parent[i] = i;myrank[i] = 1;}}int find_set(int x){if(x != parent[x]){parent[x] = find_set(parent[x]);}return parent[x];}void union_set(int x, int y){x = find_set(x), y = find_set(y);if(x != y){if(myrank[x] < myrank[y]){parent[x] = y;myrank[y] += myrank[x];}else{parent[y] = x;myrank[x] += myrank[y];}}}int main(){  int n, m;int i, j, x, y, fx, fy;int minD,maxD;int isOK;while(scanf("%d %d", &x, &y) != EOF){if(x == -1 && y == -1){break;}if(!x && !y){printf("Yes\n");continue;}//initmake_set(NSIZ);isOK = 0;minD = min(x, y);maxD = max(x, y);do{minD = min(minD, min(x, y));maxD = max(maxD, max(x, y));flag[x] = 1;flag[y] = 1;fx = find_set(x);fy = find_set(y);if(fx == fy){isOK = -1; //标志图中有环}else{union_set(x, y);}}while(scanf("%d %d", &x, &y) != EOF && (x + y));//图中无环时,看看图是否是连同的,如果不是连同的则会有至少2个根节点if(!isOK){for(i = minD; i <= maxD; ++i){if(flag[i] && i == find_set(i)){isOK++;}}}if(isOK == 1){printf("Yes\n");}else{printf("No\n");}}return 0;}


原创粉丝点击