HDU 1272 小希的迷宫 (并查集)

Posted dwtfukgv

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 1272 小希的迷宫 (并查集)相关的知识,希望对你有一定的参考价值。

题意:你懂得。

析:根据题意我们应该知道是首先是不能含有环的,如果含有环那么路径就不唯一,其次要连通,因为如果不连通,那么有的结点就无法相连,

就不满足,仅有一条路径的条件了,判环用并查集,非常方便,在输入时要判断是这条边是不是已经连通了,如果已经连通了那么肯定就是环了,

也就不符合题意了,其次就是要判断是不是都连通,可以通过是不是一个根结点来判,其次我用的是离散上的知识,判断是不是树的条,很明显,

没有环,又全连通就是树的呗,也就是结点减一等于的边数。再就是这个题有一个坑,输入0 0要输出Yes,刚开始WA了一次。

代码如下:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <set>
#include <cstring>
#include <cmath>

using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int maxn = 100000 + 5;
int p[maxn];
set<int> s;

int Find(int x){  return x == p[x] ? x : p[x] = Find(p[x]); }

int main(){
    int u, v, num;
    while(scanf("%d %d", &u, &v) == 2 && u+v >= 0){
        if(!u && !v){ puts("Yes");  continue; }
        num = 1;
        bool ok = true;
        s.clear();
        for(int i = 0; i < maxn; ++i)  p[i] = i;
        p[v] = u;
        s.insert(u);  s.insert(v);
        while(scanf("%d %d", &u, &v) == 2 && u+v){
            int x = Find(u);
            int y = Find(v);
            if(x != y)   p[y] = x;
            else  ok = false;
            s.insert(u);  s.insert(v);
            ++num;
        }
        if(ok && num == s.size()-1)  puts("Yes");
        else   puts("No");
    }
    return 0;
}

 

以上是关于HDU 1272 小希的迷宫 (并查集)的主要内容,如果未能解决你的问题,请参考以下文章

HDU 1272: 小希的迷宫(并查集)

HDU1272:小希的迷宫(并查集)

HDU 1272 小希的迷宫(乱搞||并查集)

hdu 1272 小希的迷宫并查集

ACM-并查集之小希的迷宫——hdu1272

HDU 1272 小希的迷宫(并查集,判断是否成环)