首页 > 其他 > 详细

数据结构-图基础-kruskal

时间:2021-06-09 21:29:11      阅读:28      评论:0      收藏:0      [点我收藏+]

首先利用结构体存边,排序(快排,或者建堆),遍历所有边,利用并查集判断边两个端点是否在同一个集合中。

acwing-859

技术分享图片

 

 

#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
struct edge{
    int a, b, c;
    bool operator<(const edge& w){
        return c < w.c;
    }
}ed[2 * N];
int p[N], n, m;
//并查集
int find(int x){ if(x == p[x]) return x; else return p[x] = find(p[x]); } int kruskal(){ for(int i = 1; i <= n; i++) p[i] = i; sort(ed, ed + m); int ans = 0, cnt = 0; for(int i = 0; i < m; i++){ int a = ed[i].a, b = ed[i].b; if(find(a) != find(b)){ p[find(a)] = find(b); ans += ed[i].c; cnt++; } } if(cnt == n - 1) return ans; else return -1; } int main(){ cin >> n >> m; for(int i = 0; i < m; i++){ int a, b, c; cin >> a >> b >> c; ed[i] = {a, b, c}; } int ans = kruskal(); if(ans == -1) printf("impossible"); else printf("%d\n", ans); return 0; }

 

数据结构-图基础-kruskal

原文:https://www.cnblogs.com/hxlll/p/14868197.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!