图论 Kruskal 最小生成树算法

news2024/11/15 21:43:50

前置知识

关于最小生成树

先说「树」和「图」的根本区别:树不会包含环,图可以包含环

树就是「无环连通图」

生成树是含有图中所有顶点的「无环连通子图」

你要保证这些边:

1、包含图中的所有节点。

2、形成的结构是树结构(即不存在环)。

3、权重和最小。

关于Union-Find

=> 作用:对树进行判定

对于添加的这条边,如果该边的两个节点本来就在同一连通分量里,那么添加这条边会产生环;

反之,如果该边的两个节点不在同一连通分量里,则添加这条边不会产生环

判断两个节点是否连通(是否在同一个连通分量中)就是 Union-Find 算法的拿手绝活

同一个连通分量就是有着共同父节点的一群结点


Kruskal算法

Kruskal算法就是在确保一些结点在一些边的关系下能构成树时执行贪心算法

说白了就是按照权重大小就是从小到大进行排序

connections里面的vector的前两项放的是结点,后面放的是权重

#include <bits/stdc++.h>
using namespace std;


class UF {
private:
    int count = 0; // 记录连通分量
    vector<int> parent; // 节点x的父节点是parent[x]

public:
    UF(int n) {
        this->count = n;
        parent.resize(n);
        for(int i = 0; i < n; i++) {
            parent[i] = i;
        }
    }

    void Union(int p, int q) {
        int rootP = find(p);
        int rootQ = find(q);
        if(rootP == rootQ) return;
        parent[rootQ] = rootP;
        count--;
    }

    bool connected(int p, int q) {
        int rootP = find(p);
        int rootQ = find(q);
        return rootP == rootQ;
    }

    int find(int x) {
        // 根节点的parent[x] == x,层层向上找就好啦
        if(parent[x] != x) {
            parent[x] = find(parent[x]);
        }
        return parent[x];
    }

    int getCount() { return count; }

};

int Kruskal(vector<vector<int>>& connections) {
    int n = connections.size();
//    序号从1 -> n
    UF uf(n + 1);
    sort(connections.begin(), connections.end(), [](auto& a, auto& b) { return a[2] < b[2]; });
    int mst = 0;
    for(auto c: connections) {
        int u = c[0], v = c[1], weight = c[2];
//        如果这两个结点是同一连通分量=> 则不能连接
        if(uf.connected(u, v)) continue;
        mst += weight;
        uf.Union(u, v);
    }
//    0开着没用
    return uf.getCount() == 2 ? mst : -1;
}

int main() {
    int n;
    cin >> n;
    vector<vector<int>> connections;
    while(n--) {
        int u, v, weight;
        cin >> u >> v >> weight;
        vector<int> temp(3);
        temp[0] = u, temp[1] = v, temp[2] = weight;
        connections.emplace_back(temp);
    }
    cout << Kruskal(connections);
    return 0;
}

1584. 连接所有点的最小费用 - 力扣(LeetCode)

class UF {
private:
    int count = 0;
    vector<int> parent;

public:
    UF(int n) {
        this->count = n;
        parent.resize(n);
        for(int i = 0; i < n; i++) parent[i] = i;
    }

    void Union(int p, int q) {
        int rootP = find(p), rootQ = find(q);
        if(rootP == rootQ) return;
        parent[rootQ] = rootP;
        count--;
    }

    bool connected(int p, int q) {
        int rootP = find(p), rootQ = find(q);
        return rootP == rootQ;
    }

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

    int getCount() { return count; }
};

class Solution {
public:
    int minCostConnectPoints(vector<vector<int>>& points) {
        // 这题要根据给的points先构造一个connections
        vector<vector<int>> connections;
        int n = points.size();
        for(int i = 0; i < n; i++) {
            for(int j = i + 1; j < n ; j++) {
                int xi = points[i][0], yi = points[i][1];
                int xj = points[j][0], yj = points[j][1];
                connections.push_back({i, j, abs(xi - xj) + abs(yi - yj)});
            }
        }
        // &不加是拷贝,会增加时间复杂度
        sort(connections.begin(), connections.end(), [](auto& a, auto& b){ return a[2] < b[2]; });
        int mst = 0;
        UF uf(n);
        for(auto& c: connections) {
            int u = c[0], v = c[1], weight = c[2];
            if(uf.connected(u, v)) continue;
            mst += weight;
            uf.Union(u, v);
        }
        return uf.getCount() == 1 ? mst : -1;
    }

};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/452621.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NFS共享存储服务

目录 一、NFS简介二. NFS工作原理实验&#xff1a;准备一台服务器&#xff0c;一台客户端。实现共享目录服务器上发布共享目录配置操作客户端配置操作 总结 一、NFS简介 NFS&#xff08;Network File System 网络文件服务&#xff09; NFS 是一种基于 TCP/IP 传输的网络文件系…

五一国际劳动节知多少!祝五一劳动节快乐! Happy International Workers‘Day!

五一国际劳动节简称五一节&#xff0c;在每年的5月1日&#xff0c;它是全世界劳动人民的共同节日。5.1 International labor Days call 5.1 sections, May 1 in every year. It is the whole world labor common festival of the people. 劳动是人类的幸福之源。 Work is the t…

JQuery-原理示意图-- 选择器-- 选择器综合代码--jQuery 的 DOM 操作--增删改查节点--常用遍历节点方法--多选框应用--全部综合代码

目录 JQuery 基本介绍 jQuery 的原理示意图 JQuery 基本开发步骤 说明: jQuery简单示例 jQuery 对象和 DOM 对象 什么是 jQuery 对象 DOM 对象转成 jQuery 对象 应用实例 jQuery 对象转成 DOM 对象 代码演示 jQuery 选择器 jQuery 选择器介绍 jQuery 选择器的优…

Adaptive AUTOSAR 文档官方如何阅读

目前很多关于 Adaptive AUTOSAR 的文章都是官方文档的简化翻译&#xff0c;不如直接看官方文档更全面深入。 Adaptive AUTOSAR 文档官方下载地址 Adaptive Platform AUTOSARhttps://www.autosar.org/standards/adaptive-platform About The AUTOSAR Adaptive Platform impl…

JavaScript 教程---菜鸟教程

文章目录 JavaScript 教程JavaScript 输出JavaScript 对象JavaScript 函数JavaScript 事件 JS 函数JS 类JS HTML DOMJS 高级教程JS 浏览器 BOMJS 库 JavaScript 教程 JavaScript 输出 JavaScript 可以通过不同的方式来输出数据 使用window.alert()弹出警告框。 <script&…

物联网产品的开发的难点,致命点是什么?

物联网产品的开发的难点&#xff0c;致命点是什么&#xff1f; 当下是万物互联的时代&#xff0c; 物联网产品本身的难度因行业而异。但是物联网设备上云通信交互就成了各个行业需要首先解决的问题。 物联网通信问题从产品设计一开始&#xff0c;如果不能很好的解决&#xff0c…

C++引用详解

1.引用概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同一块内存空间。 比如&#xff1a; 这是简单的引用 注意&#xff1a;引用类型必须和引用实体是同一种类型。 2.…

数据仓库技术与Hive入门

文章目录 数据仓库基本概念场景案例主要特征主流开发语言-SQL数仓开发语言概述SQL语言介绍结构化数据SQL语法分类 Apache Hive入门Apache Hive 安装部署元数据 Hive SQL语言 数据仓库 基本概念 数据仓库(Data Warehouse,简称数仓、DW)&#xff0c;是一个用于存储&#xff0c;分…

FMC128:具有出色的同步性能-8通道同步采集

板卡概述 FMC128 是一款 8 通道 250MHz 采样率 16 位 AD 采集 FMC子卡&#xff0c;符合 VITA57 规范&#xff0c;可以作为一个理想的 IO 模块耦合至 FPGA 前端&#xff0c;8 通道 AD 通过高带宽的 FMC 连接器&#xff08;HPC&#xff09;连接至 FPGA 从 而大大降低了系统信号…

八、vue_options之computed、watch属性选项

一、computed计算属性使用 &#xff08;1&#xff09;复杂data的处理方式 &#xff08;2&#xff09;computed 计算属性 computed计算属性初体验&#xff1a; 在我们通过Vue调用createApp方法传入一个对象的时候&#xff0c;我们之前写了data属性、methods属性&#xff0c;这…

关于一个C++项目的总结与反思:bosot搜索引擎

文章目录 写在前面关于这个项目的收获简单的项目介绍整体逻辑与第三方库每一步的具体细节util.hppparser.ccindex.hppsearcher.hpphttp_server.hpp其他模块 项目地址&#xff1a;boost_searcher: 项目&#xff1a;boost站内搜索 (gitee.com) 写在前面 这个项目是用C写的&…

聚焦能源 | 赛宁网安亮相2023年中国能源网络安全大会

​​4月21日&#xff0c;2023年中国能源网络安全大会&#xff08;以下简称“大会”&#xff09;在江苏南京成功落幕&#xff01;为贯彻国家网络强国战略&#xff0c;加强能源网络安全技术创新、成果应用、人才培养与技术交流&#xff0c;大会推出主旨论坛、案例交流、展览展示等…

python:根据灰度值检查成像是否存在黑图情况

一、需求描述 1、摄像机在拍照的时候&#xff0c;会打开闪光灯进行拍照&#xff0c;假如闪光灯在拍照之后打开&#xff0c;就会产生黑图 2、因此&#xff0c;我们需要摄像机采集很多图片&#xff0c;检查是否每次拍照都是正常的 3、我们可以通过人眼进行查看&#xff0c;但是…

SpringCloud入门实战(七)-Hystrix服务熔断入门案例

&#x1f4dd; 学技术、更要掌握学习的方法&#xff0c;一起学习&#xff0c;让进步发生 &#x1f469;&#x1f3fb; 作者&#xff1a;一只IT攻城狮 。 &#x1f490;学习建议&#xff1a;1、养成习惯&#xff0c;学习java的任何一个技术&#xff0c;都可以先去官网先看看&…

Mysql 学习(七)独立表结构存储 一

独立表空间结构 InnoDB有很多类型表空间&#xff0c;这边主要是介绍独立表空间结构&#xff0c;因为这种会用的比较多讲之前我们先思考一个问题&#xff0c;如果我们以页为单位来分配存储空间的话&#xff0c;那两个页之间的物理距离可能很远&#xff0c;因为这是随机的&#…

2023有哪些适合学生用蓝牙耳机?300左右最好的蓝牙耳机推荐

2023年了&#xff0c;蓝牙耳机常常伴随手机出现在人们的日常生活当中&#xff0c;不管是听歌、运动、甚至玩游戏&#xff0c;大多数人都会选择戴蓝牙耳机。那么&#xff0c;有哪些适合学生用的蓝牙耳机&#xff1f;针对这个问题&#xff0c;我来给大家推荐几款300左右最好的蓝牙…

故障分析 | 从 Insert 并发死锁分析 Insert 加锁源码逻辑

作者&#xff1a;李锡超 一个爱笑的江苏苏宁银行 数据库工程师&#xff0c;主要负责数据库日常运维、自动化建设、DMP平台运维。擅长MySQL、Python、Oracle&#xff0c;爱好骑行、研究技术。 本文来源&#xff1a;原创投稿 *爱可生开源社区出品&#xff0c;原创内容未经授权不得…

Python初学小知识(十四):数据分析处理库Pandas

Python初学小知识&#xff08;十四&#xff09;&#xff1a;数据分析处理库Pandas 十八 Pandas1 文件读取1.1 读取csv1.2 读取txt1.3 读取excel&#xff08;xlsx&#xff09; 2 内容读取2.1 读取行2.2 读取列 3 数据处理3.1 加减乘除3.1.1 列 与 元素3.1.2 列 与 列 3.2 最值、…

React-Native 热更新实践

以下是基于CodePush的热更新方案的实践,有需要的可以参考一下: 一、配置appcenter 1.1 安装appcenter 安装appcenter的命令如下: npm install -g appcenter-cli /** 安装完成后 */ appcenter help /** 如果出现帮助指令说明安装成功 */安装成功之后,登录appcenter,涉…

Python——线性回归、梯度下降、正则化(原理)

目录 1 线性回归-最小二乘法(LSM) 2 梯度下降 3 数据归一化/标准化 4 过拟合和欠拟合 4.1 过拟合的处理 4.2 欠拟合的处理 5 正则化 一种通过属性的线性组合来进行预测的 线性模型 &#xff0c;其目的是找到一条直线或者一个平面或者更高维的超平面&#xff0c; 使得预…