题目链接:[HDU1272]小希的迷宫[并查集]
题意分析:小希的迷宫需要满足:1.每条路之间都是联通的;2.地图中不能出现回路。只要满足上述条件就输出『Yes』,否则『No』。
解题思路:赤裸裸的并查集- -。注意坑点:有可能给出多个不联通的地图集合,所以在输出结果前要判断一下是否有多个地图集合。
个人感受:坑坑的我没有发现有多个集合这种事情TAT
具体代码如下:
#include <iostream> #include <cstring> #include <algorithm> using namespace std; const int MAXN = 100010; int p[MAXN], ran[MAXN]; //ran用于表示节点高度,默认低节点向高节点合并 bool vis[MAXN]; //记录该点是否为地图中的点 void init() //初始化并查集 { for (int i = 1; i < MAXN; ++i) p[i] = i, ran[i] = 0; memset(vis, 0, sizeof(vis)); } int find(int x) { if (p[x] == x) return x; else return p[x] = find(p[x]); } void unit(int a, int b) { int x = find(a), y = find(b); if (ran[x] < ran[y]) p[x] = y; else{ p[y] = x; if (ran[x] == ran[y]) ++ran[x]; } } int main() { ios_base::sync_with_stdio(0); int a, b; bool flag = 1; init(); while (cin >> a >> b && a != -1) { vis[a] = 1, vis[b] = 1; if (a == 0) { int coun = 0; //输出结果前判断是否有多个集合存在。 for (int i = 1; i < MAXN; ++i) if (vis[i] && i == p[i]) ++coun; if (coun > 1) flag = 0; cout << (flag == 0 ? "No":"Yes") << '\n'; flag = 1; //重新初始化 init(); } else { if (find(a) != find(b)) unit(a, b); else { flag = 0; } } } return 0; }