首页 > 其他分享 >2023-04-07 无向有权图之最小生成树问题

2023-04-07 无向有权图之最小生成树问题

时间:2023-04-07 23:59:40浏览次数:58  
标签:07 04 Kruskal 最小 生成 切分 算法 无向 横切

无向有权图之最小生成树问题

前10章我们讲解地都是无向无权图,本章我们将讲解无向有权图,以及无向有权图的经典问题:最小生成树问题(MST:Minimum Spanning Tree)

1~2 无向有权图的实现

主要是用TreeMap代替了无向无权图的TreeSet

本节用到的图

graph_txt的含义
上面的graph.txt对应的图如下:
graph.txt对应的图

最终的代码

3 最小生成树和Kruskal算法

什么是生成树

用n-1条边把含有n个顶点的图连接起来就形成了图的生成树,一个图一般都有很多个不同的生成树

graph.txt对应的图
的两个生成树如下:
生成树图示

什么是最小生成树

在有权图中,不同的n-1条边形成的不同生成树其权总和一般也就不同,权值总和最小的就叫最小生成树

最小生成树的用途

  • 布线设计
  • 网络设计
  • 电路设计
  • 保证图联通且费用最低

求最小生成树的思想

把所有的边进行排序,基于贪心思想使用权值小的边,一旦选到的边使得图中有环就舍弃这条边,如此下去一直到选够n-1条边,这n-1条边组成的生成树就是最小生成树

上面的过程就是求最小生成树的Kruskal算法

4 Kruskal算法正确性的理论保证:切分定理

切分

把图中的顶点分为两部分,就称为一个切分

如下面几个图都不同的颜色均组成一个切分
切分1


切分2



切分3

横切边

如果一个边的两个端点,属于切分不同的两边,则这个边被称为横切边

下面是图的一种切分的横切边
横切边举例
下面是图的另一个切分的横切边:
横切边举例2

切分定理

横切边中的最短边,一定属于最小生成树

切分定理

反证法证明:如下图,a、b、c是蓝红切分的所有横切边,红蓝里面的顶点和边加上a组成了最小生成树,a是a、b、c中权值最小的,假设a不是最小生成树的一条边,那么b、c中的一条可以代替a称为最小生成树的一部分(必须从横切边中选取一条才能使得蓝红两部分是联通地),但是b、c中任何一条加入,新的生成树的权值综合肯定大于替换a之前的,所以得证a一定是最小生成树的一条边
反证法证明切分定理

具体的例子可以见下图:
反证法证明切分定理的例子

Kruskal算法与切分定理的关系

Kruskal算法每次选择一个最短边,如果这个边没有形成环:相当于是对一个切分,选择了最短横切边
Kruskal算法与切分定理的关系

5~6 Kruskal算法实现

如何快算判断已有的边中是否有环

  • DFS 每次判断的事件复杂度都是O(V+E),而且对动态变化的图性能不高
  • 使用并查集:事件复杂度是O(E),而且支持动态变化的图很好。

所以我们使用并查集来实现已有边中是否有环的快速判断,思想如下:
之前已经加入地边都放到到一个并查集中,一个联通分量内的两个点在并查集中是true,如果我们要加入地边的两个端点在并查集中为true,那么这条边加入一定会生成环。
简而言之,kruskal算法新加入的边的两个顶点在并查集中必须为false,否则不能加入
快速判断一个图中是否有环之并查集

并查集相关的只是可以参考

Kruskal算法实现

测试图如下:
测试图

Kruskal求最小生成的时间复杂度是O(ElogE)级别的

时间开销主要是在Collections.sort(edges);

7~9 Prim算法

回顾切分定理

切分定理

Prim算法的原理和过程模拟

按照顶点个数从(1, v-1)、(2, v-2)、.....不断划分切分,对每种切分都找最短横切边,最后横切边加入到mst列表中,就形成了最小生成树
Prim算法过程

详细过程模拟如下(@Todo):

Prim算法的事件复杂度:O(VE)

Prim算法的时间复杂度

Prim算法优化

基于优先队列(最小堆)快速找到最小的横切边。优化后的算法时间复杂度和Kruskal一样是O(ElogE)

10 本章总结

知识点

  • 带权图
  • 最小生成树问题
  • 切分定理
  • Kruskal求最小生成树
  • Prim求最小生成树

Kruskal和Prim算法的代码实现关键

Kruskal和Prim算法的代码实现关键

更多最小生成树的算法

更多最小生成树的算法

标签:07,04,Kruskal,最小,生成,切分,算法,无向,横切
From: https://www.cnblogs.com/lsgwr/p/17297699.html

相关文章

  • 2023.04.07 - 前端常用解决跨域问题的方案
    JSONP:JSONP(JSONwithPadding)是一种前端跨域请求的方式,它利用了HTML中的<script>标签没有跨域限制的特点,通过动态创建<script>标签,构造一个特殊的URL,让服务端返回一段指定的JavaScript代码,然后在本地执行这段代码以达到跨域请求数据的目的。JSONP具有兼容性好、简单易......
  • codeforces 1804D Accommodation
    https://codeforces.com/problemset/problem/1804/D解题思路每个楼层是独立的,考虑怎么解决一层就可以了。求最大值就是尽量避免1和1合并,也就是尽量在不存在连续1的子序列中进行合并,如果还有需要合并的就只能用1和1合并。求最小值就是尽量合并1和1。由于只需要输出最大最小值,所......
  • 每日总结2023-04-07
    今天对前几天的的界面做了优化packagecom.example.math;/**注册界面*/importandroidx.annotation.NonNull;importandroidx.appcompat.app.AppCompatActivity;importandroid.content.Intent;importandroid.os.Build;importandroid.os.Bundle;importandroid.os......
  • C/C++模拟ATM机存取款管理系统[2023-04-07]
    C/C++模拟ATM机存取款管理系统[2023-04-07]2、模拟ATM机存取款管理系统模拟银行的自动取款机使用过程中的界面和用户交互过程。实现查询银行卡余额、取款修改密码、退出系统等功能。(一)功能要求及说明:(1)将银行账户的卡号,户名,密码和账户余额从外部文件(银行账户.txt)中读入......
  • Hugging News #0407: Google AI 的 Pix2Struct 来啦、开发者资源页面发布
    每一周,我们的同事都会向社区的成员们发布一些关于HuggingFace相关的更新,包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等,我们将其称之为「HuggingNews」,本期HuggingNews有哪些有趣的消息,快来看看吧!社区活动ControlNet微调冲刺活动为了帮......
  • 4.07每日总结
    MySQLNULL值处理我们已经知道MySQL使用SQLSELECT命令及WHERE子句来读取数据表中的数据,但是当提供的查询条件字段为NULL时,该命令可能就无法正常工作。为了处理这种情况,MySQL提供了三大运算符:ISNULL: 当列的值是NULL,此运算符返回true。不是空:当列的值不为NULL,......
  • 2023.04.07 - 用jQuery发起JSONP请求时jsonpCallback和success的回调区别在哪?
    在使用jQuery发起跨域请求时,可以通过指定dataType为jsonp来实现JSONP跨域请求。此时,jQuery会自动生成一个回调函数,并将其作为参数发送给服务器。服务器需要将返回数据包装在回调函数中,以便于客户端解析。以下是一个简单的jQuery实现JSONP跨域请求的示例:$.ajax({......
  • 1604. 警告一小时内使用相同员工卡大于等于三次的人
    题目链接:1604.警告一小时内使用相同员工卡大于等于三次的人方法:模拟解题思路先对数据进行处理,根据\(name\)将其时间存储在哈希表中,对哈兮表进行遍历,每个\(name\)对应一个时间序列,首先对时间序列进行从小到大排序,从\(i=2\)开始遍历该序列,若存在\(list[i-2]+60>=......
  • flask框架04 导出项目 local flask生命执行流程 wtforms
    今日内容详细目录今日内容详细1请求上下文分析(源码:request原理)1.1导出项目的依赖1.2函数和方法1.3threading.local对象1.4偏函数1.5flask整个生命执行流程(1.1.4版本为例)2wtforms(了解)1请求上下文分析(源码:request原理)1.1导出项目的依赖#之前pipfreeze>requ......
  • # システムに関して知識の復習は始まります20230407
    システムに関して知識の復習は始まります20230407今回、Markdowmで要点をメモしておくつもり、まずMarkdownの学んだ方法は以下です。1タイトル:二級タイトル三級タイトル四級タイトル2字体=フォントfont"Hello,World!"Hello,World!"cm+i斜体;"Hello,World!"cm+b太字;......