HDUOJ 1272 小希的迷宫

来源:互联网 发布:mac如何安装dmg 编辑:程序博客网 时间:2024/05/21 22:45

原题传送门

本文只为自己保存,侵删。


参考:AC_Dreameng博客

思路:并查集,检查回路。


//利用并查集搜索回路 #include<stdio.h>const int N = 100005;int ap[N], father[N];int findFather(int x) {if (x != father[x])father[x] = findFather(father[x]);return father[x];//寻找x所在并查集的根节点 }void combine(int x, int y) {int fx = findFather(x);int fy = findFather(y);father[fx] = fy;//通过将一个并查集的根节点设置成 }//另一个集根节点的父节点合并 void init() {for (int i = 0; i < N; i++) {ap[i] = 0;father[i] = i;//设置出现集合和父节点集合}} int main() {int a, b, sum;bool flag;while(scanf("%d%d", &a, &b) == 2) {if (a == -1 && b == -1) break;init(); sum = 0;flag = false;while(1) {if (a == 0 && b == 0) break;if (findFather(a) == findFather(b))flag = true;//若根节点相同则构成环 combine(a, b);//将a,b放入同一个集合 ap[a] = 1;ap[b] = 1;//设置出现记录 scanf("%d%d", &a, &b);}if(flag) printf("no\n");else{for (int j = 0; j < N; j++) {if (ap[j] && father[j] == j) sum++;}//if条件是节点出现且根是自身的//情况,即得到并查集的个数 if (sum > 1) printf("no\n");else printf("yes\n");}}return 0;} 


0 0
原创粉丝点击