最小生成树学习笔记(持续更新)
先抄点本子上的基本概念(有改动,仅供参考)
1.生成树定义:
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。在一个有v个点的无向连通图中,取其中v-1条边,并使所有顶点联通,所得到的子图称为原图的一颗生成树。
ps:如果以v-1条边连接v个顶点,那么总可以将图分为如此的子图
然而这样的 点边集合 所构成的联通图,一定是没有回路的(除非再来一条边),所以生成的一定是一颗tree
(然而是定理,不用说)
2.最小生成树:
在一个带权的无向连通图中,各边权和最小的一颗生成树即为原图的最小生成树。(duang~duang~定义~)
3.最小边原理:
图中权值最小的边,(如果唯一),一定在最小生成树上。
(瞎掰start)
在生成树中,每个点都通过唯一的一条边连接到 生成树 上,
生成树是原联通图的一个子图,所以如果将一个点与最小生成树的连接断开,
能将该点与最小生成树连接的边的数量 一定 >=1,为了使生成树是最小生成树,
选择将该点与最小生成树连接的边一定是最小的,
然而对于每个点,以上瞎掰内容都是适用的,此连通图的边的集合中的边也一定都在
刚才提到的“选择对象”中,所以图中权值最小的边(如果唯一),一定在最小生成树上。
(瞎掰end)
(仅供参考,不保证正确,也不严谨)
5.对于一个图G,如果图中边权值都不相同,则图的最小生成树是唯一的,反之不然。
Prim最小生成树算法
本子上说,prim是贪心算法
它的思想如下:
任意时刻的连边状态都是一棵树,从某一点开始,每次都花最小的代价,用一条边加进一个新的点。
那么最小代价如何确定呢?按照本子上的算法流程,是用 已进入最小生成树的点 与 未进入最小生成树
的点 之间的边权来更新最小代价。
道理我们都懂,下面主要谈prim的堆优化
本子上给出的prim例子,复杂度是O(n^2),本子告诉我
求最小值(min值)的过程可以用堆来优化
代码不鸽了
这份代码在这道题(https://www.luogu.org/problemnew/show/P3366)中是比kruskal快的
继续鸽
