zoukankan      html  css  js  c++  java
  • 【图论】KruskalMST算法

    适用于无向图。其实找出来的是一片最小生成森林来的,并不一定是树,取决于原图是否连通。

    int n, m;
    
    const int MAXM = 200000 + 10;
    
    struct DisjointSet {
    
        static const int MAXN = 200000 + 10;
        int fnd[MAXN], siz[MAXN];
    
        void Init(int n) {
            for(int i = 1; i <= n; i++)
                fnd[i] = i, siz[i] = 1;
        }
    
        int Find(int x) {
            return x == fnd[x] ? x : fnd[x] = Find(fnd[x]);
        }
    
        bool Merge(int x, int y) {
            x = Find(x), y = Find(y);
            if(x == y)
                return 0;
            if(siz[x] < siz[y])
                swap(x, y);
            fnd[y] = x;
            siz[x] += siz[y];
            return 1;
        }
    
    } dsu;
    
    
    struct Edge {
        int u, v, w;
        bool operator<(const Edge& edge)const {
            return w < edge.w;
        }
    } edge[MAXM];
    
    ll mst() {
        for(int i = 1; i <= m; ++i)
            edge[i] = {u, v, w};
        sort(edge + 1, edge + 1 + m);
        dsu.Init(n);
        ll res = 0;
        for(int i = 1; i <= m; ++i) {
            int u = edge[i].u;
            int v = edge[i].v;
            int w = edge[i].w;
            if(dsu.Merge(u, v))
                res += w;
        }
        return res;
    }
    
  • 相关阅读:
    随笔
    std::condition_variable(复习)
    随笔
    std::vector<std::vector<> >
    staitc_cast,const_cast....
    复制构造函数
    c++ 临时对象
    复制初始化和直接初始化
    随笔
    Fedora 安装oracle11g 之最简洁方式
  • 原文地址:https://www.cnblogs.com/purinliang/p/14284407.html
Copyright © 2011-2022 走看看