【MST最小生成树】Kruskal克鲁斯卡尔算法

学好并查集很重要QAQ

kruskal就是把边按权值大小排序,再用并查集连接节点而成的

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

struct Edge{
    int v1, v2, w;
};

bool cmp(Edge e1, Edge e2){
    return e1.w < e2.w;
}

int par[5005];

int find(int x){
    if(x == par[x])
        return x;
    par[x] = find(par[x]);
    return par[x];
}

bool is_connected(int x, int y){
    return find(x) == find(y);
}

void connect(int x, int y){
    int a = find(x);
    int b = find(y);
    par[a] = b;
}

int main()
{
    int n,m;
    int num = 0, ans = 0; //边数,生成树权值和
    cin >> n >> m;
    Edge a[200005];
    for (int i = 0; i < m; ++i) {
        scanf("%d %d %d", &a[i].v1, &a[i].v2, &a[i].w);
    }
    sort(a,a+m,cmp);

    for (int i = 1; i <= n; ++i) {
        par[i] = i;
    }
    for (int i = 0; i < m; ++i) {
        int v1 = a[i].v1;
        int v2 = a[i].v2;
        int w = a[i].w;
        if(!is_connected(v1,v2)){
            connect(v1,v2);
            ans += w;
            num++;
        }
    }
    if(num < n-1){ //生成树至少要有n-1条边
        cout << "orz" << endl;
    }
    else{
        cout << ans << endl;
    }

    return 0;
}
 

猜你喜欢

转载自blog.csdn.net/qq_30115697/article/details/81839249