模版最小生成树Kruskal模版

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模版最小生成树Kruskal模版相关的知识,希望对你有一定的参考价值。

最小生成树简单来说就是在一个有$n$条边的有权无向连通图中选出$n-1$条边,使图连通并且这$n-1$条边的边权和最小。

Kruskal算法是用一种贪心的思想,先将所有的边按边权排序,按边权从小到大顺序枚举边,如果起点和终点不在一个集合,就选这条边,并将起点和终点合并成一个集合;反之则不选此边。集合可以用并查集维护。

(以上内容纯属瞎编,若要系统学习请百度)

下面是模版

//最小生成树(Kruskal)模版 
//By LC  2017.2.19整理 
#include <cstdio>
#include <algorithm>
using namespace std;
const int M = 200005, N = 5005;
struct Node {
    int u, v, w;
}a[M];
int t[N];
bool cmp(Node x, Node y) {
    return x.w < y.w;
}
int Find(int i) {
    if(t[i] == i)
        return i;
    else
        return t[i] = Find(t[i]);
}
int main() {
    int n, m, i, j, ans = 0;
    scanf("%d%d", &n, &m);
    for(i = 1; i <= m; i++)
        scanf("%d%d%d", &a[i].u, &a[i].v, &a[i].w);
    for(i = 1; i <= n; i++)
        t[i] = i;
    sort(a+1, a+1+m, cmp);
    for(i = j = 1; i <= m && j <= n; i++) {
        int ss = Find(a[i].u), 
            tt = Find(a[i].v);
        if(ss != tt) {
            ans += a[i].w;
            t[ss] = tt;
            j++;
        }
    }
    printf("%d", ans);
    return 0;
}

 

以上是关于模版最小生成树Kruskal模版的主要内容,如果未能解决你的问题,请参考以下文章

最小生成树(模版)

最小生成树 模版

luoguP1195 口袋的天空

最小生成树matlab代码Kruskal算法,用于二维网络生成

最小生成树matlab代码Kruskal算法,用于二维网络生成

最小生成树详解 prim+ kruskal代码模板