最小生成树

Kruskal

#include<bits/stdc++.h>
#define ri register int
#define ll long long
#define fast ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
using namespace std;
const inline int read(){
    int k = 0, f = 1; char c = getchar();
    for(;!isdigit(c); c = getchar())
        if(c == '-') f = -1;
    for(;isdigit(c); c = getchar())
        k = k * 10 + c - '0';
    return k * f;
}
int n, m, f[1005], ans = 0, cnt = 0, sum = 0;
struct edge{
    int u, v, w;
}r[100005];
int find(int x){
    if(x == f[x]) return x;
    return f[x] = find(f[x]);
} 
bool cmp(edge x, edge y){
    return x.w < y.w;
}
void kruskal(){
    for(ri i = 1; i <= m; ++i){
        int a = find(r[i].u), b = find(r[i].v);
        if(a == b)
            continue;
        f[a] = b;
        cnt++;
        ans += r[i].w;
        if(cnt == n - 1)
            break;
    }
}
int main(){
    n = read(), m = read();
    for(ri i = 1; i <= n; ++i)
        f[i] = i;
    for(ri i = 1; i <= m; ++i){
        r[i].u = read();
        r[i].v = read();
        r[i].w = read();
        sum += r[i].w;
    }
    sort(r + 1, r + m + 1, cmp);
    kruskal();
    ans = sum - ans;
    printf("%d",ans);
    return 0;
}

 

posted @ 2020-03-26 15:13  kojoker  阅读(144)  评论(0)    收藏  举报