最小生成树 kruskal算法(模板)

kruskal算法计算最小生成树

const int maxn = 105;
const int maxm = 1050;

int n, m;
int par[maxn];
struct Edge {
    int from, to, dist;
}edges[maxm];

bool cmp(Edge x, Edge y) { return x.dist < y.dist; }
int find(int x) { return par[x] == x ? x : par[x] = find(par[x]); }
int kruskal() {
    int ans = 0;
    for (int i = 0; i < n; ++i) par[i] = i;
    sort(edges, edges + m, cmp);
    for (int i = 0; i < m; ++i) {
        Edge e = edges[i];
        int x = find(e.from);
        int y = find(e.to);
        if (x != y) { ans += e.dist; par[x] = y; }
    }
    return ans;
}

测试程序

#include<bits/stdc++.h>
using namespace std;

const int maxn = 105;
const int maxm = 1050;

int n, m;
int par[maxn];
struct Edge {
    int from, to, dist;
}edges[maxm];

bool cmp(Edge x, Edge y) { return x.dist < y.dist; }
int find(int x) { return par[x] == x ? x : par[x] = find(par[x]); }
int kruskal() {
    int ans = 0;
    for (int i = 0; i < n; ++i) par[i] = i;
    sort(edges, edges + m, cmp);
    for (int i = 0; i < m; ++i) {
        Edge e = edges[i];
        int x = find(e.from);
        int y = find(e.to);
        if (x != y) { ans += e.dist; par[x] = y; }
    }
    return ans;
}

int main() {
    while (scanf("%d%d", &n, &m) == 2) {
        for (int i = 0; i < m; ++i) scanf("%d%d%d", &edges[i].from, &edges[i].to, &edges[i].dist);
        cout << kruskal() << endl;
    }
    return 0;
}
/*
5 7 
0 1 100
0 2 30
0 4 10
2 1 60
2 3 60
3 1 10
4 3 50
*/

转载于:https://www.cnblogs.com/wafish/p/10465426.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值