zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    HTML+CSS简单实现导航栏二级下拉菜单
    原创 | 我的个人微信公众号
    原创 | 喂,在吗?
    NodeJs实现邮箱验证
    JS排序算法(二)冒泡排序
    JS排序算法(一) 快速排序
    前端常见的布局方式
    JS继承方式
    前端Node实现简易的文件上传下载
    原生js实现深度克隆
  • 原文地址:https://www.cnblogs.com/dwtfukgv/p/5596138.html
Copyright © 2011-2022 走看看