最小树形图
5第五章 最小树问题
最小树问题有很多很广泛的应用.例如,我们把 图5.1.3(a)的图G中的五个顶点看成某个镇的5个村, G的边看成是公路,现在要假设电线(电线必须沿着公 路假设),使各村之间都能通电话,问应该怎样架线, 才能使所用的电线最少?
考虑一下,就可以看出,这个问题的关键是决定 图上哪些边上架线,哪些边上不架线.设架线的边的集 合是E1,那么G1=(V,E1)就是G的一个支撑子图.因为架线 后各个村之间都能通话,所以G1必须是连通的.因此要 使电线最节约,就是要从G的所有连通的支撑子图中, 把总边长最小的找出来,但是不难看出,总边长最小 的连通支撑子图一定不会含圈,从而必定是一个支撑 树.因此假设电线的问题就归结为最小树问题. 类似的问题还有很多,例如修公路把一些城镇连 接起来,修渠道使水源和各块地连接起来,等等,都 可以归结为最小树问题.同时,最小树问题还是图论 中其它很多问题的基础,也就是说,有不少的问题在 计算时,往往首先必须求出一个最小树,这也是最小 树问题显得特别重要的一个原因.
G有好几个圈,现在任取一个,例如就取:
P1={v1,v2,v4,v1}.
这个圈上有三条边,最长的是(v1,v4),长度是5,我们就
把这条边去掉,从而也就把p1破掉了.
v1 5 v4 3 p1 2 8 v2 6 v5 6 5 v3
v1
5 v4
3
v2
6 5
v3
最小树的名词解释
最小树的名词解释
最小树是图论中的一个概念,它是指在一个连通的无向图中,通过选择最少的边将所有的顶点连接起来的一棵树。最小树通常用于解决最优路径问题和网络设计等领域,它能够在保证所有顶点连通的前提下,使整个图的总权重最小。
为了更好地理解最小树的概念,我们可以通过一个简单的例子来说明。假设我们有一个无向图,其中有四个顶点A、B、C和D,以及相应的边AB、AC、AD、BC、BD和CD。现在的问题是如何通过选择最少的边,将所有的顶点连接起来。
为了解决这个问题,我们可以使用Kruskal算法或Prim算法来构建最小树。这两种算法在解决最小树问题上非常有效。
在Kruskal算法中,首先将所有边按照权重从小到大进行排序。之后,依次从最小权重的边开始选择,但要保证所选择的边不会形成环路。当所有的顶点都被连接起来,即形成一棵树时,这棵树就是最小树。
而在Prim算法中,则是从一个初始顶点开始,逐渐将与该顶点相连的边加入最小树中,直到所有的顶点都被连接起来。
无论是Kruskal算法还是Prim算法,它们都能够快速地找到最小树。通过这种方式,我们可以在保证图的连通性的前提下,选择最少的边来构建一棵最小树。
最小树不仅仅在图论中有应用,它也可以被应用在其他领域。例如,最小树经常被用于解决计算机网络设计中的问题。在设计网络拓扑结构时,我们希望通过尽可能少的连接来保证所有节点之间的可达性和通信效率。使用最小树可以帮助我们找到一个经济高效的网络设计方案。
此外,最小树还可以用于解决最优路径问题。在网络路由或交通规划中,我们经常需要找到一条连接所有目标点的最短路径。使用最小树可以帮助我们找到连接所有目标点的最短路径,从而提高路由的效率和减少通信成本。
树与图的最小树
树与图的最小树
v1 23 v6 28 v5 36 25 17 16 v4
Page 18
20
v2 4
15 9 v3 3
1
v7
树与图的最小树
v1 23 v6 28 v5 25 17 16 v4 1 v7 9 v3 3
Page 19
20
v2 4
15
树与图的最小树
v1 23 v6 28 v5 25 17 16 v4 1 v7 9 v3 3
性质5:树无回圈,但不相邻的两个点之间加一条边,恰 得到一个圈。
树与图的最小树
图的最小部分树(支撑树)
Page 4
如果G2是G1的部分图,又是树图,则称G2是G1的部分树 (或支撑树)。树图的各条边称为树枝,一般图G1含有多 个部分树,其中树枝总长最小的部分树,称为该图的最小 部分树(或最小支撑树)。
Page 20
20
v2 4
15
树与图的最小树
v1 23 1 v7 4 9 28 v5 25 17 16 v4 v2 15 v3 3
Page 21
v6
树与图的最小树
v1 23 1 v7 4 9 28 v5 25 16 v2 15 v3 3 v4
Page 22
v6
17
树与图的最小树
v1 23 1 v7 4 9 28 v5 25 16 v3 3 v4 v2
教学课件:第五章-最小树问题
理论分析与证明
对于最小树问题的求解算法 ,需要深入的理论分析和证 明,以揭示算法的内在机制 和性能。未来可以进一步研 究算法的理论基础和数学证 明,为算法的设计和分析提 供更严格的依据。
THANKS FOR WATCHING
感谢您的观看
教学课件:第五章-最小树问
目录
• 引言 • 最小树问题的算法 • 最小树问题的实例分析 • 最小树问题的扩展问题 • 总结与展望
01 引言
最小树问题的定义
最小树问题
在给定一个连通加权无向图,寻找一棵权值和最小的树,使得这 棵树覆盖所有的顶点。
最小生成树
在连通加权无向图中,一个生成树是原图的子图,且包含原图的所 有顶点,且不含任何环。
04 最小树问题的扩展问题
带权重的最小生成树问题
总结词
带权重的最小生成树问题是在最小生成树问题的基础上,给 每条边赋予一个权重值,目标是寻找一棵权值最小的生成树 。
详细描述
在带权重的最小生成树问题中,每条边都有一个关联的权重 ,表示该边的长度或代价。算法需要选择一组边,这些边能 够连接所有节点并且总权值最小。常见的带权重的最小生成 树算法有普里姆算法和克鲁斯卡尔算法。
都被包含在最小生成树中。
实例二:有向图的最小生成树
要点一
总结词
要点二
详细描述
有向图的最小生成树问题是在有向图中寻找一棵包含图所 有顶点的树,使得这棵树的边的权值之和最小。
信息学奥赛一本通 第4章 第6节 最小生成树(C++版) ppt课件
2
1 10
12 6
5
2 89
3
3 74
5个集合{ {1},{2},{3},{4},{5} } 生成树中没有边
Kruskal每次都选择一条最小的边,而且这条边的两个顶点分属于两个 不同的集合。将选取的这条边加入最小生成树,并且合并集合。
ppt课件
14
Kruskal算法
第一次选择的是<1,2>这条边,将这条边加入到生成树中,并且将它的两个顶点1、 2合并成一个集合。
我们通过对下图最小生成树的求解模拟来理解上面的思想。蓝点和虚线代表未 进入最小生成树的点、边;白点和实线代表已进入最小生成树的点、边。
ppt课件
5
Prim算法
初始时所有点都是蓝点,min[1]=0,min[2、3、4、5]=∞。权值之和MST=0。
1
2 4
22
1 3
6
5
71
4
第一次循环自然是找到min[1]=0最小的蓝点1。将1变为白点,接着枚举与1相连的 所有蓝点2、3、4,修改它们与白点相连的最小边权。
begin
①合并u,v所在的集合,相当于把边(u,v)加入最小生成树。
②tot=tot+W(u,v)
③k++
④如果k=n-1,说明最小生成树已经生成,则break;
end;
图最小生成树ppt课件
(2) 按权值从小到大的顺序依次选取 图G中的边,若选取的边未使生成树T 形成回路,则加入TE;若选取的边使 生成树T形成回路,则将其舍弃。循环 执行(2),直到TE中包含(n-1)条边为 止。
6
应用克鲁斯卡尔算法构造最小生成树的过程:
7
8
普里姆(Prim)算法
普里姆算法的基本思想:普里姆算法 是另一种构造最小生成树的算法,它 是按逐个将顶点连通的方式来构造最 小生成树的。
lowcost[v]=cost[v][closest[v]],
12
为实现克鲁斯卡尔算法需要设置一维辅助数组E,按 权值从小到大的顺序存放图的边,数组的下标取值 从0到e-1(e为图G边的数目)。 假设数组E存放图G中的所有边,且边已按权值从小 到大的顺序排列。n为图G的顶点个数,e为图G的边 数。
(2)从图中删去该顶点, 同时删去所有它发出的有向边;
重复以上 (1)、(2) 步, 直到全部顶点均已输出,拓扑有序序 列形成,拓扑排序完成;或图中还有未输出的顶点,但已跳出 处理循环。这说明图中还剩下一些顶点,它们都有直接前驱, 再也找不到没有前驱的顶点了。这时AOV网络中必定存在有向 环。
24
拓扑排序的过程
则这样的有向图叫做用边表示活动的网络,简称AOE (Activity On Edges)网络。 AOE网是一个带权的有向无环图。
AOE网络在某些工程估算方面非常有用。例如,可以使人们了解: (1) 完成整个工程至少需要多少时间(假设网络中没有环)? (2) 为缩短完成工程所需的时间, 应当加快哪些活动?
10.2_最小树问题
+50+60 = 290(米)
所以,排污管道最小建设
3
30
成本 = 290×500 = 145000 元 60
1
4
40
5
30 30
7 处理中心A
50
30 20
6
8
12
OR:SM
本章小结
树是图论中应用比较活跃的领域,在各个学科中都有广 泛的应用。
例如在一些地区之间架设电话线路或铺设铁路线,修公 路等施工方案的确定,都可以采用最小树的方法求得最 佳施工方案。
8
OR:SM
试试看——你会了吗?
• 一家企业分别要在6间办公室铺设网线接入口,网线的可 行走线方式如下图所示,如何铺设网线才能使网线总长 为最短?
v2 8
v1
3
2
v3
4
v5
56
8 v4
6 v6
6
最短网线总长度为最小树权之和2+3+4+6+6=21
9
OR:SM
三、最小树问题应用案例
案例背景:某房产开发商新近开发了一个200亩面积的高档住宅小区,小区内共
管理运筹学--管理科学方法
李军பைடு நூலகம்
桂林电子科技大学商学院
第十 章 图与网络分析
内S容ub提titl要e
第一节 图论的概念 第二节 最小树问题 第三节 最短路问题 第四节 网络最大流 第五节 最小费用流
最小斯坦纳树例子
最小斯坦纳树例子
最小斯坦纳树(Minimum Steiner Tree)是指在一个图中,连接所有给定点的最小代价生成树。其实现方法有很多,其中一种比较经典的算法是基于动态规划的方法。
下面以一个简单的例子来说明最小斯坦纳树的求解过程:
假设给定一个带权无向图,其中有四个点A、B、C、D,如下图所示:
```
5 D
A --- B
| |
2 4
| |
C --- +
3
```
我们需要找到一个最小代价的生成树,使得它包含给定的三个点A、B、D。为了方便,我们先将不包含这些点的边都删除,得到以下的子图:
```
5 D
A --- B
|
+
```
接着,我们对于每个给定点,都构建一个以该点为根节点的生成树,这样就得到了三棵以A、B、D为根节点的生成树,如下图所示: ```
A B D
| | |
B A B
/ | /
C D C A C
|
D
```
对于每个给定点,我们可以通过动态规划来求解以该点为根节点的生成树的最小代价。具体来说,我们可以定义一个二维数组f(i,S),表示以节点i为根节点,S集合中的点已经被包含在生成树中的最小代价。其中,S是一个二进制数,每个二进制位表示该位置上的点是否被包含在S集合中。
我们可以通过以下递推式来计算f(i,S):
```
f(i,S) = 0, if S={i};
f(i,S) = INF, if iS or |S|=1;
f(i,S) = min{ f(i,T)+f(j,ST)+w(i,j) }, where TS and i∈T, j∈ST.
```
其中,INF表示正无穷大,w(i,j)表示节点i和j之间的边的权值。
最小生成树问题例题
最小生成树问题例题
最小生成树(Minimum Spanning Tree)是图论中的一个经典问题,它是指在一个带权无向图中找到一棵生成树,使得树上所有边的权值之和最小。最小生成树问题在实际生活中有着广泛的应用,比如电力输送、通信网络等领域。
下面我们以一个具体的例子来说明最小生成树问题的求解过程。
假设有一个无向图,图中包含了6个节点(A、B、C、D、E、F)和9条边。每条边都有一个权值,表示连接两个节点的成本。我们的目标是找到一棵最小生成树。
首先,我们可以使用 Prim 算法来求解最小生成树。Prim 算法的基本思想是从一个起始节点开始,逐步扩展生成树,直到包含所有节点为止。具体步骤如下:
1. 选择一个起始节点,将其标记为已访问。
2. 从已访问的节点中,选择一条连接到未访问节点的最短边。
3. 将这条边加入到最小生成树中,并将连接的节点标记为已访问。
4. 重复步骤2和步骤3,直到所有节点都被访问过。
根据上述算法,我们可以依次选取边 AB、CD、BC、EF、DE 来构建最
小生成树。最终的最小生成树是:A-B、C-D、B-C、E-F 和 D-E 这五条边,它们的权值之和为12。
另外一个常用的求解最小生成树问题的算法是 Kruskal 算法。Kruskal 算法的基本思想是将图中的边按照权值从小到大进行排序,然后依次选取边,如果这条边连接的两个节点不在同一个连通分量中,就将这条边加入到最小生成树中。具体步骤如下:
1. 对图中的边按照权值进行排序。
2. 从权值最小的边开始,依次选取边。
3. 如果选取的边连接的两个节点不在同一个连通分量中,就将这条
斯坦纳树算法
斯坦纳树算法
斯坦纳树算法,也称为“终极斯坦纳树算法”,是一种用于解决带权图中的最小树形图问题的算法。该算法具有时间复杂度为O(n^3 * 2^n)的特点,因此适用于小型图和中等规模的图,但在大型图上会出现运行时间过长的问题。
斯坦纳树算法的基本思想是将原图中的顶点集合划分成若干个
子集,然后对每个子集构建一棵最小树形图,最后将所有子集的最小树形图合并成一棵最终的最小树形图。该算法的核心在于如何构建子集的最小树形图,这通常使用DP(动态规划)的方式进行求解。
具体而言,斯坦纳树算法的步骤如下:
1.将所有边的权值取对数,并对原图做一些预处理,以提高算法效率。
2.对于每个子集S,使用DP的方式计算S中所有点到S中某个点的最短距离,记为d(S,v),其中v是S中任意一个点。
3.对于每个子集S,将S中所有点连成一棵生成树,使得该树的根节点为S中某个点,且所有连边的权值之和等于d(S,v)。
4.通过枚举所有的子集S,计算每个子集的最小树形图,并记录下最小树形图的权值。
5.将所有子集的最小树形图合并成一棵最终的最小树形图。
需要注意的是,斯坦纳树算法只适用于有向图,且存在一些限制条件,如原图必须联通等。此外,该算法在实际应用中,可能需要结合其他算法一起使用,以解决一些特殊情况下的问题。
朱刘算法(最小树形图)
图论是ACM竞赛中比较重要的组成部分,其模型广泛存在于现实生活之中。因其表述形象生动,思维方式抽象而不离具体,因此深受各类喜欢使劲YY的Acmer的喜爱。这篇文章引述图论中有关有向图最小生成树的部分,具体介绍朱刘算法的求解思路,并结合一系列coding技巧,实现最小树型图O(VE)的算法,并在最后提供了该算法的模版,以供参考。
关于最小生成树的概念,想必已然家喻户晓。给定一个连通图,要求得到一个包含所有顶点的树(原图的子图),使之所构成的边权值之和最小。在无向图中,由于边的无向性质,所以求解变得十分容易,使用经典的kruskal与prim算法已经足够解决这类问题。而在有向图中,则定义要稍微加上一点约束,即以根为起点,沿给定有向边,可以访问到所有的点,并使所构成的边权值之和最小,于是问题开始变得不一样了,我们称之为最小树型图问题。
该问题是由朱永津与刘振宏在上个世纪60年代解决的,值得一提的是,这2个人现在仍然健在,更另人敬佩的是,朱永津几乎可以说是一位盲人。解决最小树型图的算法后来被称作朱刘算法,也是当之无愧的。
首先我们来阐述下算法的流程:算法一开始先判断从固定根开始是否可达所有原图中的点,若不可,则一定不存在最小树形图。这一步是一个很随便的搜索,写多搓都行,不加废话。第二步,遍历所有的边,从中找出除根结点外各点的最小入边,累加权值,构成新图。接着判断该图是否存在环。若不存在,则该图便是所求最小树型图,当前权为最小权。否则对环缩点,然后回到第二步继续判断。
这里存在一系列细节上的实现问题,以确保能够达到VE的复杂度。首先是查环,对于新图来说只有n-1条入边,对于各条入边,其指向的顶点是唯一的,于是我们可以在边表中添加from,表示该边的出发点,并考虑到如果存在环,则对环上所有边反向,环是显然同构的,于是最多作V次dfs就能在新图中找到所有的环,并能在递归返回时对顶点重标号进行缩点,此步的重标号可以用hash数组映射。然后就是重要的改边法,对于所有不在环上的边,修改其权为w-min(v),w为当前边权,min(v)为当前连接v点的最小边权。其数学意义在于选择当前边的同时便放弃了原来的最小入边。我们可以知道,每次迭代选边操作O(E),缩点操作O(V),更新权操作O(E),至少使一个顶点归入生成树,于是能在V-1步内完成计算,其复杂度为O(VE)。
最小生成树-数学建模.ppt
引例:计算机网络的 线路设计
城市电信局有许多业务如收费, 营业,112,114等,希望在全市范围 实现计算机联网服务,共享各种资源。 一个主要关心的问题是:用数据通讯 线把一组站点联结起来,而不允许通 讯线在非站点处相交,如何连接可使 通讯线的花费最小?
引例:计算机网络的线路设计
8
1
2
5
7
1
5
6
显然 01
1) (i,j)=0和(i,j)=1分别
表示什么?2) 表达了什么?
建模
构造加权图 以机器为顶点,作一个完全图,每条边
(i,j)被赋予权(i,j)。
原问题的转化 加权图的最小生成树是由那些相异度最
小的边构成的连通图,如果希望把机器分成k 个组,就继续删去最小生成树上权最大的k-1 条边。于是得到k个分离的子树,每棵树的顶 点集就构成各机器组。
用Kruskal算法可求出最小生成树,在前面 给出的Kruskal算法的MATLAB程序中,边权矩阵b 的值改为此处的边权矩阵,顶点数n改为9即可。
上一页 下一页 主 页
T= 7 8 15 12 39 46 47 45 13
c = 4.4300
机器的分组:{3, 9},
{1,2,5},
{4,6,7,8}。
1) 贪婪法可被用于各种各样问题的 处理。该法只是一种试探法,计 算上简便有效,可提供正确解的 一个近似。但一般情况下,不能 保证输出的解是正确的。其正确 性需要证明,这往往比较困难。
03 最小生成树
2
5
3 4
Kruskal(克鲁斯卡尔) Kruskal(克鲁斯卡尔)算法
1 5 3 6 5 6 4 6 2 1
6 2 3
5 5 4 2 3 5 5
1 1 3 4 6 4 2
1. 从空集开始逐步增加 中的边,Kruskal算法可称 从空集开始逐步增加TE中的边 中的边, 算法可称 加边法” 为“加边法”。 2. Kruskal算法逐步增加生成树的边, 适合于稀疏图 算法逐步增加生成树的边, 稀疏图 算法逐步增加生成树的边 适合于稀疏
普里姆(Prim)算法过程示例 普里姆(Prim)算法过程示例 (Prim)
28 1 10 6 25 25 5 22 4 14 7 18 2 16 3 12
普里姆算法 例: 50 B 40 A 60 52 C
逐步加点法 逐步加点法。 加点 A 45 B E D
U={A}
C G F
65 D 42 G 50 30 E 70 A 50 B E D F G F C
A 50 B 40 E
U = { A, B, E }
C D F G
U = { A, B }
A 50 B 40 E D 50
C G F A 50 B 40 E G 30 F D 42 50 30 F G C
A 50 B 40
60 52
C
图论中的最小树及其应用
图论中的最小树及其应用
在我们日常的生活中,我们会遇到很多关于优化问题的场景,如网络中的最小生成树问题、高速路网中的最短路径问题以及生产调度中的最优方案问题等等。这些问题可能由多个因素影响而产生,而图论中的最小树正是一种解决这类问题的有效方法。
最小树,又称为生成树,是指一个无向图的一个子图,该子图包含了该图所有的节点,并且是一棵树。最小树中的边权值总和是最小的,也即最小生成树。
最小树的生成方法有很多种,其中最典型的是Kruskal算法和Prim算法。
Kruskal算法
Kruskal算法是一种贪心算法,其基本思想是“按边权值从小到大依次选择边,如果该边的两个端点不在同一个连通块中,则加入该边,将这两个连通块合并为一个”。
具体实现方法如下:
1. 将待处理的边按照边权值从小到大排序;
2. 初始化为每个节点构成一个单独的连通块;
3. 从小到大地选择各个边,当且仅当选择这条边不会形成回路时,将它加入最小生成树,并合成一个连通块。
Prim算法
Prim算法同样是一种贪心算法,其基本思路是“从一个点出发,每次选择一条边权值最小的边与当前生成树相连,直到生成树中
包含了图的所有节点”。
具体实现方法如下:
1. 选择一个起点加入最小生成树,并标记为已访问;
2. 找到能够与该起点相连的所有边,并选择边权值最小的那一
条边加入最小生成树;
3. 将新加入的节点标记为已访问,重复步骤2,直至所有的节
点都被访问过。
最小树的应用
最小树的一个显著的应用是在网络中,如建立一颗覆盖广域网中所有节点的最小生成树。这样的最小树可以帮助我们找到最少的路由器连接方法,从而减少数据包的传输时间和网络的延迟。
最小生成树-数学建模
模型求解
对表1给出的数据,加权图的边权矩阵如下: [1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 5 5 5 5 6 6 6 7 7 8;
234567893456789456789 5 6 7 8 9 6 7 8 9 7 8 9 8 9 9; 0.5 1 0.89 0.14 1 1 1 1 1 1 0.62 1 1 1 1 1 1 1 1 1 0.5 0.87 0.67 0.75 0.75 1 1 1 1 1 1 1 1 0 1 1]
例 (最优连线问题)我国西部的SV地区共有1个城市(标 记为1)和9个乡镇(标记为2--10)组成,该地区不久将用 上天然气,其中城市1含有井源.现要设计一供气系统,使得 从城市1到每个乡镇(2--10)都有一条管道相连,并且铺设 的管子的量尽可能的少. 下表给出了城镇之间的距离.求SV 地区的最优连线.
1) 贪婪法可被用于各种各样问题的 处理。该法只是一种试探法,计 算上简便有效,可提供正确解的 一个近似。但一般情况下,不能 保证输出的解是正确的。其正确 性需要证明,这往往比较困难。
2) 已证明,求最小生成树的Kruskal算 法和Prim算法都是正确的
返回
范例:制造系统的分组技术
分组技术是设计制造系统的一种方 法,它把生产零件的机器分组,相应地 把需生产的零件分类,使零件跨组加工 的情形尽量少,最理想的情况是使每个 零件的加工,都在组内完成。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
poj3164
最小树形图,就是给有向带权图中指定一个特殊的点root,求一棵以root为根的有向生成树T,并且T 中所有边的总权值最小。最小树形图的第一个算法是1965年朱永津和刘振宏提出的复杂度为O(VE)的算法。
判断是否存在树形图的方法很简单,只需要以v为根作一次图的遍历就可以了,所以下面的算法中不再考虑树形图不存在的情况。
在所有操作开始之前,我们需要把图中所有的自环全都清除。很明显,自环是不可能在任何一个树形图上的。只有进行了这步操作,总算法复杂度才真正能保证是O(VE)。
首先为除根之外的每个点选定一条入边(以该点为终点的有向边),这条入边一定要是所有入边中最小的。现在所有的最小入边都选择出来了,如果这个入边集不存在有向环的话,我们可以证明这个集合就是该图的最小树形图。这个证明并不是很难。如果存在有向环的话,我们就要将这个有向环所称一个人工顶点,同时改变图中边的权。假设某点u在该环上,并设这个环中指向u的边权是in[u],那么对于每条从u出发的边(u, i, w),在新图中连接(new, i, w)的边,其中new为新加的人工顶点; 对于每条进入u的边(i, u, w),在新图中建立边(i, new, w-in[u])的边。为什么入边的权要减去in[u](等效抵消,在还原有向生成树时是等价的),这个后面会解释,在这里先给出算法的步骤。然后可以证明,新图中最小树形图的权加上旧图中被收缩的那个环的权和,就是原图中最小树形图的权。(没有有向圈后就完成了算法)
上面结论也不做证明了。现在依据上面的结论,说明一下为什么出边的权不变,入边的权要减去in [u]。对于新图中的最小树形图T,设指向人工节点的边为e。将人工节点展开以后,e指向了一个环。假设原先e是指向u的,这个时候我们将环上指向u的边in[u]删除,这样就得到了原图中的一个树形图。我们会发现,如果新图中e的权w'(e)是原图中e的权w(e)减去in[u]权的话,那么在我们删除掉in[u],并且将e恢复为原图状态的时候,这个树形图的权仍然是新图树形图的权加环的权,而这个权值正是最小树形图的权值。所以在展开节点之后,我们得到的仍然是最小树形图。逐步展开所有的人工节点,就会得到初始图的最小树形图了。
如果实现得很聪明的话,可以达到找最小入边O(E),找环O(V),收缩O(E),其中在找环O(V)这里需要一点技巧。这样每次收缩的复杂度是O(E),然后最多会收缩几次呢?由于我们一开始已经拿掉了所有的自环,我门可以知道每个环至少包含2个点,收缩成1个点之后,总点数减少了至少1。当整个图收缩到只有1个点的时候,最小树形图就不不用求了。所以我们最多只会进行V-1次的收缩,所以总得复杂度自然是O(VE)了。由此可见,如果一开始不除去自环的话,理论复杂度会和自环的数目有关。
要点:
首先判断连通性,若从根节点能访问到每个节点,说明存在有向生成树
其次在判断是否存在有向圈,对n个顶点找n-1个最小弧,要么某个节点的前代节点是树根,要么存在有向圈,具体处理时将整个圈收缩到首次发现存在圈的节点