ch10 课堂参考代码

ch10 最小生成树

生成树:对于 n 个结点 m 条边的无向图 G,由全部 n 个结点和其中 n - 1 条边构成的无向连通子图称为 G 的一棵生成树。

  • 如果图 G 原本就不连通,则不存在生成树,只存在生成森林。

最小生成树(Minimum Spanning Tree,MST):对于带边权的无向图 G,边的权值之和最小的生成树称为 G 的最小生成树。

求解 MST 常用 Kruskal 算法或 Prim 算法,这两种算法都基于贪心法。

  • Kruskal 算法时间复杂度 O ( m log ⁡ m ) O(m\log m) O(mlogm) ,适用于稀疏图。
  • Prim 算法时间复杂度 O ( n 2 ) O(n^2) O(n2) ,适用于完全图或稠密图。

模板

prim

算法流程:选取任意一个结点作为树 T,然后贪心地选取离 T 最近的那个点,并把它和对应的边加到 T 中。不断进行这个操作,就可以得到一棵最小生成树 T。

const int inf = 0x3f3f3f3f;
const int maxn = 5010;
int cost[maxn][maxn];
// 是否在 T 中
bool used[maxn];
// 点 i 与 T 相连的最短边的权值
int d[maxn];
int n;/*
标记一个点 d[u] = 0
循环地执行:不在 T 中的节点与 T 相连的最短的边,拥有该边的节点 u最小生成树权值加上这条边把 u 加入 T:维护 used, d
直到 n 个点全部加入 T 中
*/
long long prim() {memset(d, 0x3f, sizeof(d));d[1] = 0;  // 希望第一步加入点 1long long res = 0;for (int i = 1; i <= n; ++i) {int u = -1;for (int v = 1; v <= n; ++v) {// 选不在树 T 且与 T 相连的最短边if (!used[v] && (u == -1 || d[v] < d[u])) u = v;}if (d[u] == inf) return -1;// 把点 u 加入树 Tres += d[u];used[u] = 1;for (int v = 1; v <= n; ++v) {if (!used[v]) d[v] = min(d[v], cost[u][v]);}}return res;
}

kruskal

算法流程:每次都从剩余的边中选出一条边权最小的,并且这条边的两个端点 u 和 v 属于两个不同的连通分量(即 u 和 v 不连通),则加入该边,连接两个连通分量。

const int maxn = 100010, maxm = 100010;
struct Edge {int u, v, w;bool operator<(const Edge &n) const { return w < n.w; }
}E[maxm];
int fa[maxn], n, m;
void init() {for (int i = 1; i <= n; i++) fa[i] = i;
}
int find(int x) {if (fa[x] == x) return x;return fa[x] = find(fa[x]);
}
void merge(int x, int y) {int rx = find(x), ry = find(y);fa[ry] = rx;
}
long long kru() {sort(E, E + m); // 边权从小到大排序long long res = 0;int cnt = n; // 记录当前连通分量的个数for (int i = 0; i < m; ++i) {Edge e = E[i];if (find(e.u) != find(e.v)) {merge(e.u, e.v);--cnt, res += e.w;}}if (cnt > 1) return -1; // 不连通return res;
}
int main() {cin >> n >> m;for (int i = 0; i < m; ++i) {cin >> E[i].u >> E[i].v >> E[i].w;}init();cout << kru() << endl;return 0;
}

注意并查集只是维护结点的连通情况,不代表最终的 MST。如果需要将 MST 储存起来方便后面遍历这棵 MST,可以用 vector 数组(邻接表)将加入的边 e[i] 储存。

// 有边权的情况,需要储存出边的终点v和边权w
struct Edge2{int v, w;
};
vector<Edge2> G[N]; // G[u]储存结点u的所有出边信息(终点v和边权w)// 选中e[i]这条边加入时,执行
G[e[i].u].push_back({e[i].v, e[i].w});
G[e[i].v].push_back({e[i].u, e[i].w});

瓶颈生成树

  • 指最大的边权值最小的生成树。

  • 与最小生成树的区别

    • 最小生成树目标是希望所有边权加起来最小。
    • 瓶颈生成树目标是希望边权最大的那条边权值尽量小。如果把边权理解为边的长度,就是希望最长的那条边尽量短。
  • 性质: 最小生成树一定是瓶颈生成树,而瓶颈生成树不一定是最小生成树。

    反证法证明:

    设最小生成树中的最大边权为 w,如果最小生成树不是瓶颈生成树的话,则瓶颈生成树的所有边权都小于 w。

    只需删去原最小生成树中的最长边,用瓶颈生成树中的一条边来连接删去边后形成的两棵树,得到的新生成树一定比原最小生成树的权值和还要小,这样就产生了矛盾。

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

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

相关文章

费曼技巧及提高计划

费曼技巧及提高计划 一、什么是费曼技巧&#xff1f; 费曼技巧&#xff08;Feynman Technique&#xff09;由诺贝尔物理学奖得主理查德费曼提出&#xff0c;是一种通过“以教代学”来彻底理解复杂概念的学习方法。其核心逻辑是&#xff1a; “如果你不能简单解释一件事&#x…

LongRefiner:解决长文档检索增强生成的新思路

大语言模型与RAG的应用越来越广泛&#xff0c;但在处理长文档时仍面临不少挑战。今天我们来聊聊一个解决这类问题的新方法——LongRefiner。 背景问题&#xff1a;长文档处理的两大难题 使用检索增强型生成&#xff08;RAG&#xff09;系统处理长文档时&#xff0c;主要有两个…

5月16日复盘-目标检测开端

5月16日复盘 一、图像处理之目标检测 1. 目标检测认知 ​ Object Detection&#xff0c;是指在给定的图像或视频中检测出目标物体在图像中的位置和大小,并进行分类或识别等相关任务。 ​ 目标检测将目标的分割和识别合二为一。 ​ What、Where 2. 使用场景 目标检测用于…

MySQL基础面试通关秘籍(附高频考点解析)

文章目录 一、事务篇&#xff08;必考重点&#xff09;1.1 事务四大特性&#xff08;ACID&#xff09;1.2 事务实战技巧 二、索引优化大法2.1 索引类型全家福2.2 EXPLAIN命令实战 三、存储引擎选型指南3.1 InnoDB vs MyISAM 终极对决 四、SQL优化实战手册4.1 慢查询七宗罪4.2 分…

Word图片格式调整与转换工具

软件介绍 本文介绍的这款工具主要用于辅助Word文档处理。 图片排版功能 经常和Word打交道的人或许都有这样的困扰&#xff1a;插入的图片大小各异&#xff0c;排列也参差不齐。若不加以调整&#xff0c;遇到要求严格的领导&#xff0c;可能会让人颇为头疼。 而这款工具能够统…

工业巡检机器人 —— 机器人市场的新兴增长引擎

摘要 在机器人产业蓬勃发展的当下&#xff0c;不同类型机器人的市场表现差异显著。工业机械臂虽市场规模庞大&#xff0c;但已趋近饱和&#xff0c;陷入红海竞争&#xff1b;人形机器人因技术瓶颈仍多停留于实验室阶段&#xff0c;距离大规模商用尚有较长距离。与之形成鲜明对比…

Oracle where条件执行先后顺序

Oracle where条件执行先后顺序 在Oracle数据库中&#xff0c;WHERE子句的条件执行顺序通常是根据你在WHERE子句中指定的条件来决定的&#xff0c;而不是按照某种固定的顺序执行的。当你编写一个WHERE子句时&#xff0c;你可以包含多个条件&#xff0c;这些条件可以是逻辑运算符…

在Linux中使用 times函数 和 close函数 两种方式 打印进程时间。

times函数用于获取当前进程时间,其函数原型如下所示: #include <sys/times.h> clock_t times(struct tms *buf); //使用该函数需要包含头文件<sys/times.h>。 函数参数和返回值含义如下: buf:times()会将当前进程时间信息存在一个 struct tms 结构体数据…

Python文字转语音TTS库示例(edge-tts)

1. 安装 pip install edge-tts2. 命令行使用 # 生成语音文件 # -f:要转换语音的文本文件,例如一个txt文件 # --text:指明要保存的mp3的文本 # --write-media:指明保存的mp3文件路径 # --write-subtitles:指定输出字幕/歌词路径 # --rate:调整语速,+50%加快了50% # --v…

Elasticsearch性能调优全攻略:从日志分析到集群优化

#作者&#xff1a;猎人 文章目录 前言搜索慢查询日志索引慢写入日志性能调优之基本优化建议性能调优之索引写入性能优化提升es集群写入性能方法&#xff1a;性能调优之集群读性能优化性能调优之搜索性能优化性能调优之GC优化性能调优之路由优化性能调优之分片优化 前言 es里面…

MongoDB从入门到实战之Windows快速安装MongoDB

前言 本章节的主要内容是在 Windows 系统下快速安装 MongoDB 并使用 Navicat 工具快速连接。 MongoDB从入门到实战之MongoDB简介 MongoDB从入门到实战之MongoDB快速入门 MongoDB从入门到实战之Docker快速安装MongoDB 下载 MongoDB 安装包 打开 MongoDB 官网下载页面&…

Serverless,云计算3.0阶段

Hi~各位读者朋友们&#xff0c;感谢您阅读本文&#xff0c;我是笠泱&#xff0c;本期简单分享下Serverless。Serverless是一种云计算服务模式&#xff0c;为业务代码提供运行环境及调度服务。开发者只需专注于编写业务逻辑代码&#xff0c;无需管理底层基础设施&#xff08;如服…

eSearch:一款集截图、OCR与录屏于一体的多功能软件

eSearch&#xff1a;一款集截图、OCR与录屏于一体的多功能软件 软件介绍 eSearch是一款专为Windows 10和11用户设计的多功能软件&#xff0c;集截图、OCR文字识别、录屏等功能于一体&#xff0c;且完全免费。其便捷版无需安装&#xff0c;运行后最小化至托盘图标&#xff0c;…

React学习———useContext和useReducer

useContext useContext是React的一个Hook&#xff0c;用于在函数组件中访问上下文&#xff08;context&#xff09;的值。它可以帮助我们在组件树中共享状态&#xff0c;而不需要通过props一层层传递 特点 用于跨组件共享状态需要配合React.createContext和Context.Provider…

安卓刷机模式详解:Fastboot、Fastbootd、9008与MTK深刷

安卓刷机模式详解&#xff1a;Fastboot、Fastbootd、9008与MTK深刷 一、刷机模式对比 1. Fastboot模式 简介&#xff1a;传统安卓底层刷机模式&#xff0c;通过USB连接电脑操作优点&#xff1a;支持大多数安卓设备&#xff0c;操作相对简单缺点&#xff1a;需要设备进入特定…

HDFS的概述

HDFS组成构架&#xff1a; 注&#xff1a; NameNode&#xff08;nn&#xff09;&#xff1a;就是 Master&#xff0c;它是一个主管、管理者。 (1) 管理 HDFS 的名称空间&#xff1b; (2) 配置副本策略。记录某些文件应该保持几个副本&#xff1b; (3) 管理数据块&#xff0…

配置Spark环境

1.上传spark安装包到某一台机器&#xff08;自己在finaShell上的机器&#xff09;。 2.解压。 把第一步上传的安装包解压到/opt/module下&#xff08;也可以自己决定解压到哪里&#xff09;。对应的命令是&#xff1a;tar -zxvf 安装包 -C /opt/module 3.重命名。进入/opt/mo…

Java笔记五

1 Math类 1.1 概述 tips&#xff1a;了解内容 查看API文档&#xff0c;我们可以看到API文档中关于Math类的定义如下&#xff1a; Math类所在包为java.lang包&#xff0c;因此在使用的时候不需要进行导包。并且Math类被final修饰了&#xff0c;因此该类是不能被继承的。 Math…

QT 插槽实现

方法 1&#xff1a;使用 default property 实现标签插入 通过定义 default property&#xff0c;可以使组件直接嵌套在目标组件中&#xff0c;类似于插槽机制。 CustomSlotExample.qml import QtQuick 2.15 import QtQuick.Controls 2.15// 定义一个支持插槽的自定义组件 Re…

spark在shell中运行RDD程序

在hdfs中/wcinput中创建一个文件&#xff1a;word2.txt在里面写几个单词 启动hdfs集群 [roothadoop100 ~]# myhadoop start [roothadoop100 ~]# cd /opt/module/spark-yarn/bin [roothadoop100 ~]# ./spark-shell 写个11测试一下 按住ctrlD退出 进入环境&#xff1a;spark-shel…