【刷题】图论——最小生成树:局域网

要想去除边,并且不改变连通性,而且去除的值最大,相当于保留最小生成树。

注意这题连通块有若干个,所以运行Kruskal相当于形成若干个最小生成树
如果是prim只能事先处理好各个连通块,然后在连通块内部单独用prim

题目链接

cpp 复制代码
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;
const int N = 110;
const int M = 10010;

struct Edge {
    int a, b, w;
    bool operator< (const Edge &t) const {
        return w < t.w;
    }
};

Edge e[M];
int p[N];
int n, m;

int find(int x) {
    if (p[x] != x) p[x] = find(p[x]);
    return p[x];
}
int kruskal() {
    for (int i = 1; i <= n; i ++ ) p[i] = i;
    sort(e, e + m);
    int res = 0;
    for (int i = 0; i < m; i ++ ) {
        int a = find(e[i].a);
        int b = find(e[i].b);
        if (a != b) {
            p[a] = b;
        }
        else {
            res += e[i].w;
        }
    }
    return res;
}
int main() {
    scanf("%d%d", &n, &m);
    int a, b, w;
    for (int i = 0; i < m; i ++ ) {
        scanf("%d%d%d", &a, &b, &w);
        e[i] = {a, b, w};
    }
    cout << kruskal() << endl;
}
相关推荐
smj2302_79682652几秒前
解决leetcode第3911题.移除子数组元素后第k小偶数
数据结构·python·算法·leetcode
Beginner x_u1 小时前
链表专题:JS 实现原理与高频算法题总结
javascript·算法·链表
_深海凉_4 小时前
LeetCode热题100-寻找两个正序数组的中位数
算法·leetcode·职场和发展
旖-旎5 小时前
深搜练习(电话号码字母组合)(3)
c++·算法·力扣·深度优先遍历
谭欣辰5 小时前
C++快速幂完整实战讲解
算法·决策树·机器学习
Mr_pyx5 小时前
【LeetHOT100】随机链表的复制——Java多解法详解
算法·深度优先
AIFarmer5 小时前
【无标题】
开发语言·c++·算法
AGV算法笔记5 小时前
CVPR 2025 最新感知算法解读:GaussianLSS 如何用 Gaussian Splatting 重构 BEV 表示?
算法·重构·自动驾驶·3d视觉·感知算法·多视角视觉
勤劳的进取家6 小时前
数据链路层基础
网络·学习·算法
Advancer-7 小时前
第二次蓝桥杯总结(上)
java·算法·职场和发展·蓝桥杯