zoukankan      html  css  js  c++  java
  • 并查集学习

    转载请注明来源:https://www.cnblogs.com/TheSilverMoon/p/9309481.html

    并查集简单点说就是判断图的两个点是否连通,但是一个个查找很麻烦,怎么办呢?那就让他们的老大直辖所有的小弟,所以我们每次查询只要看他们俩的老大是不是一样的就可以了。

    下面是我的并查集代码

    同时推荐一个大佬的解释,很有意思https://blog.csdn.net/u013546077/article/details/64509038

    #include <bits/stdc++.h>
    #define fi first
    #define se second
    #define pb push_back
    #define fio ios::sync_with_stdio(false);cin.tie(0);
    #define pii pair<int,int>
    #define vi vector<int>
    #define vc vector<char>
    #define pi 3.1415926
    
    const int INF=0x3f3f3f3f;
    const int N=1e5+5;
    
    typedef long long ll;
    typedef double db;
    typedef unsigned long long ull;
    using namespace std;
    
    int pre[N];//记录各个点的上一个节点,如果自己是老大就等于自己
    
    int findRoot(int n)//查找根节点
    {
        int r=n;
        while(pre[r]!=r)//查找这个点的根节点
        {
            r=pre[r];
        }
        //r现在是根节点
        int i=n,j;
        while(i!=r)//路径压缩,让小弟直接归老大直辖
        {
            j=pre[i];
            pre[i]=r;
            i=j;
        }
        return r;
    }
    
    void join(int x,int y)//把各个连同分支连起来
    {
        int r1=findRoot(x);
        int r2=findRoot(y);
        if(r1!=r2)//如果已经连通不用管
        {
            pre[r1]=r2;//不连通的时候随便指定一个是另一个的老大
        }
    }
    
    int main()
    {
    
    }
  • 相关阅读:
    吃一堑长一智
    人做事 天看着
    【转贴】英语中12个月名称的由来
    4199,流氓中的流氓
    【转贴】看D片容易误解的10个词组
    【转载】中国小吃(英文表达)
    拼死拼活为了啥!
    GCII 1.4对1.31改进
    上古III的汉化和美化修正
    linux下tar的用法
  • 原文地址:https://www.cnblogs.com/TheSilverMoon/p/9309481.html
Copyright © 2011-2022 走看看