Kruskal算法求最小生成树

rt

所有的边权录入,然后根据权排序,从小到大构成最小生成树。使用并查集,确保在一个联通的不要再更新。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>

using namespace std;

struct abv{
    int a;
    int b;
    int v;
};

bool compareb(abv& x, abv& y){
    return x.v < y.v;
}

int find(int a, vector<int>& P){
    if(a == P[a])return a;
    else{
        P[a] = find(P[a],P);
        return P[a];
    }
}

void merge(int a, int b, vector<int>& P){
    int fa = find(a,P);
    int fb = find(b,P);
    P[fa] = fb;
}

int main()
{
    int n,m;
    int a,b,v;
    cin >> n >> m;
    vector<abv> ev; 
    abv X;
    while (m -- ){
        cin >> a >> b>> v;
        X.a = a;
        X.b = b;
        X.v = v;
        if(a!=b)ev.push_back(X);
    }
    sort(ev.begin(),ev.end(),compareb);
    vector<bool> inflag(n+1,false);
    vector<int> P(n+1);
    for (int i = 1; i <= n; i ++ ) P[i] = i;
    int count = 0;
    int total = 0;
    int p = 0;
    while(p<ev.size()&&count!=n-1){
        int u = ev[p].a;
        int t = ev[p].b;
        int w = ev[p].v;
        if(find(u,P)==find(t,P)){
            p++;
            continue;
        }
        merge(u,t,P);
        count ++;
        p++;
        total += w;
    }
    if(count == n-1)cout << total;
    else cout << "impossible"<<endl;
    return 0;
}
posted @ 2025-08-21 11:39  .N1nEmAn  阅读(8)  评论(0)    收藏  举报