zoukankan      html  css  js  c++  java
  • 10.合并集合 并查集

     

    并查集的作用

     

     并查集是用树的形式维护所有集合

    每一个集合用一个树来维护

    每一个集合的编号是它根节点的编号

    令每一个树根的p[x] = x

    然后对于每一个点,都存储一下这个点的父节点是谁,p[x] = ?

    然后当我们想求某个点属于哪个集合的时候

    就找到这个点的father,然后看其是不是树根,不是的话就继续向上找。寻根问祖,追本溯源,找它祖宗

     

     

    在问题2中,可以优化,用路径压缩

     在x找到它的根节点时,把这条路径上所有点的父节点都直接指向根节点 ------路径压缩

     并查集加了这一个优化之后,就可以看成是O(1)的时间复杂度了

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int N = 100010;
     4 int p[N]; //存储每个元素父节点是谁
     5 int find(int x) { //返回x的祖宗节点,即返回x所在集合的编号 ,加上路径压缩优化 
     6     if (p[x] != x) {
     7         p[x] = find(p[x]);
     8     }
     9     return p[x];
    10 }
    11 int main() {
    12     int n, m;
    13     cin >> n >> m;
    14     for (int i = 1; i <= n; i++) {
    15         p[i] = i;
    16     }
    17     while (m--) {
    18         string op;
    19         int a, b;
    20         cin >> op;
    21         if (op == "M") {
    22             cin >> a >> b;
    23             p[find(a)] = find(b);
    24         } else {
    25             cin >> a >> b;
    26             if (find(a) == find(b)) {
    27                 cout << "Yes" << endl;
    28             } else {
    29                 cout << "No" << endl;
    30             }
    31         }
    32     }
    33     return 0;
    34 } 
  • 相关阅读:
    python中装饰器的原理
    python中封装、继承、多态
    Linux 中数组的使用
    Linux中环境变量中文件执行顺序
    Linux中FTP的一点理解
    原来... 拷贝构造函数的参数为什么必须使用引用类型
    C++ Programming language读书笔记
    linux 用户态 内核态
    Linux命令学习整理。
    fork &vfork --陈皓
  • 原文地址:https://www.cnblogs.com/fx1998/p/13291313.html
Copyright © 2011-2022 走看看