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 } 
  • 相关阅读:
    TSQL编程的全局变量
    一、读大学,究竟读什么?
    受用一生的心理寓言
    字符串函数
    android wait notify实现线程挂起与恢复
    Java Thread.interrupt 中断JAVA线程
    android实现文件下载功能的3种方法
    Android startActivityForResult 和 setResult的使用
    Android 软键盘盖住输入框的问题
    Android蓝牙操作
  • 原文地址:https://www.cnblogs.com/fx1998/p/13291313.html
Copyright © 2011-2022 走看看