码迷,mamicode.com
首页 > 编程语言 > 详细

859. Kruskal算法求最小生成树

时间:2020-09-10 22:59:17      阅读:38      评论:0      收藏:0      [点我收藏+]

标签:c++   opera   imp   out   clu   put   ons   ret   const   

  1. 按边权把边从小到大排序
  2. 用并查集加边
  3. 检查是否为连通图
#include<iostream>
#include<algorithm>

using namespace std;

const int N = 100010, E = 200010;

struct edge{
    int a, b, w;
    
    bool operator <(const edge &e){
        return w < e.w;
    }
}edges[E];

int n, m;
int p[N];

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

int kruskal(){
    int res = 0, cnt = 0;
    for(int i = 1; i <= m; i ++){
        int a = edges[i].a, b = edges[i].b, w = edges[i].w;
        if(find(a) != find(b)){
            p[find(a)] = find(b);
            cnt ++;
            res += w;
        }
    }
    
    if(cnt < n - 1) res = -1;
    return res;
}

int main(){
    cin >> n >> m;
    
    for(int i = 1; i <= n; i ++) p[i] = i;
    
    for(int i = 1; i <= m; i ++){
        int a, b, w;
        cin >> a >> b >> w;
        
        edges[i] = {a, b, w};
    }
    
    sort(edges + 1, edges + m + 1);
    
    int k = kruskal();
    if(~ k) cout << k;
    else puts("impossible");
    
    return 0;
}

859. Kruskal算法求最小生成树

标签:c++   opera   imp   out   clu   put   ons   ret   const   

原文地址:https://www.cnblogs.com/tomori/p/13584741.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!