题目链接:[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;
}