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

来源:互联网 发布:淘宝卖弓犯法吗 编辑:程序博客网 时间:2024/06/11 23:39

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

0 0
原创粉丝点击