题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272
给出一张图,问时候符合条件。
#pragma GCC optimize(2) #include<stdio.h> #include<algorithm> #include<string.h> #include<queue> using namespace std; const int maxn = 1e5 + 100; const int inf = 0x3f3f3f3f; typedef long long ll; int f[maxn]; int vis[maxn]; bool circle; int num; int find(int x) { if (x == f[x]) { return x; } else { return f[x] = find(f[x]); } } void _union(int a, int b) { if (a == b) { circle = true; } int x = find(a); int y = find(b); if (x != y) //判环 { f[x] = y; num++; //引出一条边 } else //如果a和b有共同的祖先,那么a和b和其祖先形成一个环 { circle = true; } } int main() { //freopen("C://input.txt", "r", stdin); while (1) { int a, b; num = 0; int vim = 0; circle = false; for (int i = 0; i <= maxn-1; i++) { f[i] = i; vis[i] = false; } scanf("%d%d", &a, &b); if (a == 0 && b == 0) { printf("Yes\n"); continue; } if (a == -1 && b == -1) { break; } vis[a] = true; vis[b] = true; _union(a, b); while (1) { scanf("%d%d", &a, &b); if (a == 0 && b == 0) { break; } vis[a] = true; vis[b] = true; _union(a, b); } for (int i = 0; i <= maxn-1; i++) { if (vis[i]) { vim++; //点数 } } if (!circle&&num + 1 == vim) { printf("Yes\n"); } else { printf("No\n"); } } return 0; }
hdu 1272 小希的迷宫 (简单并查集)
猜你喜欢
转载自blog.csdn.net/Evildoer_llc/article/details/82928749
今日推荐
周排行