基础算法学习---kruskal

使用

稀疏图求最小生成树边权和
O(mlogm)

模板

Kruskal算法求最小生成树

#include<iostream>
#include<algorithm>

using namespace std;

const int N = 200010;

int n,m;
int p[N];

//并查集
int find(int x){
    if(p[x] != x) p[x] = find(p[x]);
    return p[x];
}

//结构体存边
struct Edge{
    int a,b,w;

    bool operator < (const Edge &x) const{
        return w < x.w;
    }
} es[N];

//遍历边,若不连通,加入集合,res += 权
int kruskal(){
    int cnt = 0,res = 0;

    for(int i = 1;i <= n;i ++) p[i] = i;

    sort(es,es + m);

    for(int i = 0;i < m;i ++){
        int a = es[i].a,b = es[i].b,w = es[i].w;

        a = find(a),b = find(b);

        if(a != b){
            p[a] = b;
            res += w;
            cnt ++;
        }
    }

//不构成树
    if(cnt < n - 1) return 0x3f3f3f3f;
    else return res;
}

int main(){
    cin >> n >> m;

    for(int i = 0;i < m;i ++){
        int a,b,c;
        cin >> a >> b >> c;

        es[i] = {a,b,c};
    }

    int t = kruskal();

    if(t == 0x3f3f3f3f) cout << "impossible";
    else cout << t;
}
posted @ 2021-07-27 16:29  Xuuxxi  阅读(37)  评论(0)    收藏  举报