[HDU1272]小希的迷宫[并查集]

题目链接:[HDU1272]小希的迷宫[并查集]

题意分析:小希的迷宫需要满足:1.每条路之间都是联通的2.地图中不能出现回路。只要满足上述条件就输出『Yes』,否则『No』。

解题思路:赤裸裸的并查集- -。注意坑点:有可能给出多个不联通的地图集合,所以在输出结果前要判断一下是否有多个地图集合。

个人感受:坑坑的我没有发现有多个集合这种事情TAT

具体代码如下:

#include 
#include 
#include 
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;
}

你可能感兴趣的:([T]图论)