最小生成树问题的扩展
最小生成树 实验报告

最小生成树实验报告最小生成树实验报告一、引言最小生成树是图论中的一个重要概念,它在实际问题中有着广泛的应用。
本次实验旨在通过编程实现最小生成树算法,并通过实验数据对算法进行分析和评估。
二、算法介绍最小生成树算法的目标是在给定的带权无向图中找到一棵生成树,使得树上所有边的权重之和最小。
本次实验我们选择了两种经典的最小生成树算法:Prim 算法和Kruskal算法。
1. Prim算法Prim算法是一种贪心算法,它从一个顶点开始,逐步扩展生成树的规模,直到包含所有顶点为止。
算法的具体步骤如下:(1)选择一个起始顶点,将其加入生成树中。
(2)从与生成树相邻的顶点中选择一个权重最小的边,将其加入生成树中。
(3)重复上述步骤,直到生成树包含所有顶点。
2. Kruskal算法Kruskal算法是一种基于并查集的贪心算法,它首先将图中的边按权重从小到大进行排序,然后逐个加入生成树中,直到生成树包含所有顶点为止。
算法的具体步骤如下:(1)将图中的边按权重从小到大进行排序。
(2)逐个加入边,如果该边的两个顶点不在同一个连通分量中,则将其加入生成树中。
(3)重复上述步骤,直到生成树包含所有顶点。
三、实验过程本次实验我们使用C++语言实现了Prim算法和Kruskal算法,并通过随机生成的图数据进行了测试。
1. Prim算法的实现我们首先使用邻接矩阵表示图的结构,然后利用优先队列来选择权重最小的边。
具体实现过程如下:(1)创建一个优先队列,用于存储生成树的候选边。
(2)选择一个起始顶点,将其加入生成树中。
(3)将与生成树相邻的顶点及其边加入优先队列。
(4)从优先队列中选择权重最小的边,将其加入生成树中,并更新优先队列。
(5)重复上述步骤,直到生成树包含所有顶点。
2. Kruskal算法的实现我们使用并查集来维护顶点之间的连通关系,通过排序后的边序列来逐个加入生成树中。
具体实现过程如下:(1)将图中的边按权重从小到大进行排序。
算法解决问题的步骤经典案例

算法解决问题的步骤经典案例算法是解决问题的一种方法和步骤。
经典的案例中,算法一般包括以下步骤:问题定义、问题分析、算法设计、算法分析和算法实现。
下面,我们将介绍几个经典问题案例,并详细说明每个步骤的具体内容。
一、最小生成树问题问题定义:给定一个连通的无向图,每个边都有一个权重,需要找出一棵包含所有顶点但总权重最小的生成树。
问题分析:首先,需要理解连通图和生成树的概念。
然后,要明确最小生成树的定义和目标。
算法设计:可以使用Prim算法或Kruskal算法来解决最小生成树问题。
Prim算法从一个任意的顶点开始,逐步扩展生成树,选择与当前生成树相连的最小权重边。
Kruskal算法则是不断选择权重最小的边,直到生成树包含所有顶点为止。
算法分析:分别分析Prim算法和Kruskal算法的复杂度,比较两个算法的优劣。
算法实现:编写Prim算法和Kruskal算法的代码,并对其进行测试和调试。
二、背包问题问题定义:给定一系列物品和一个固定大小的背包,每个物品都有一个重量和一个价值。
需要确定一个最佳组合,使得背包能够装载最大价值的物品,同时不超过背包的重量限制。
问题分析:需要理解背包问题的定义和背包的限制条件。
可以将其分为01背包问题、完全背包问题和多重背包问题等。
算法设计:对于01背包问题,可以使用动态规划算法来解决。
从第一个物品开始,计算每个物品是否放入背包,使得总价值最大。
对于完全背包问题,也可以使用动态规划算法来解决,但需要考虑每个物品可以重复选择的情况。
对于多重背包问题,可以将其转化为01背包问题来解决。
算法分析:分析背包问题的复杂度,比较不同算法的效率和适用情况。
算法实现:编写动态规划算法来解决背包问题,并对其进行测试和调试。
三、图的最短路径问题问题定义:给定一个加权有向图,需要找到一个顶点到其他所有顶点的最短路径。
问题分析:需要理解最短路径的定义和目标。
可以使用Dijkstra 算法或Bellman-Ford算法来解决最短路径问题。
最小生成树简答题

最小生成树简答题1. 最小生成树(Minimum Spanning Tree,简称MST)是图论中一个重要的概念,常用于解决网络设计、电力传输、城市规划等实际问题。
它可以被定义为一个连通图的子图,包含了图中所有的顶点,且边的权重之和最小。
2. 在许多实际应用中,我们需要找到连接所有节点的最小成本路径。
这个问题可以通过最小生成树算法来解决。
最小生成树算法的目标是找到一棵包含所有节点的树,并且边的权重之和最小化。
3. 最小生成树可以使用多种算法来计算,其中最著名的两种算法是Prim算法和Kruskal算法。
这两种算法分别属于贪心算法和并查集算法。
它们的核心思想是从图中的某个节点开始,逐步扩展生成树,直到覆盖了所有的节点。
4. Prim算法是一种贪心算法,它从图中的某个节点开始,每次选择一条与当前生成树相连的最短边,并将其加入生成树中。
通过这样的方式,不断扩展生成树,直到覆盖了所有的节点。
Prim算法的时间复杂度为O(V^2),其中V是节点的数量。
5. Kruskal算法是一种基于并查集的算法,它首先将所有的边按照权重从小到大进行排序。
然后依次遍历排序后的边,如果当前边的两个节点不在同一个连通分量中,就将这条边加入生成树中,并将这两个节点合并到同一个连通分量中。
通过不断地合并连通分量,最终生成包含所有节点的最小生成树。
Kruskal算法的时间复杂度为O(ElogE),其中E是边的数量。
6. 然而,最小生成树算法并不是唯一的解决方案。
在某些特定情况下,其他算法可能更加高效。
例如,在稀疏图中,Prim 算法的时间复杂度较高,可以使用Prim算法的优化版本Prim-Jarnik算法来解决。
7. 此外,最小生成树算法还有一些扩展应用,例如最小生成森林、最小生成树问题的变体等。
最小生成森林是指一个无向图中的若干个最小生成树的集合,它可以通过去掉一些边来得到。
而最小生成树问题的变体则是在原问题的基础上增加了一些约束条件,例如要求生成树中的边的数量满足某个范围。
因为贪心而失败的例子

因为贪心而失败的例子贪心算法是一种常用的解决问题的算法思想,它通常在每一步选择中都采取当前状态下最好或最优的选择,从而希望最终能够达到全局最优的结果。
然而,贪心算法的贪心选择可能会导致最终结果并非全局最优,而是局部最优或者根本无法得到可行解。
因此,贪心算法在某些问题上会因为贪心而失败。
下面将列举10个因为贪心而失败的例子。
1. 颜色分配问题:假设有n个节点需要着色,并且相邻的节点不能具有相同的颜色。
贪心算法选择每次都选择可用颜色最少的节点进行着色。
然而,这种贪心选择可能会导致最终无法着色所有节点,因为后续节点的颜色选择受到前面节点的限制。
2. 找零问题:假设需要找零的金额为m,而只有面额为1元、5元、10元的硬币。
贪心算法选择每次都选择面额最大的硬币进行找零。
然而,在某些情况下,贪心选择可能会导致找零的硬币数量不是最小的。
3. 最小生成树问题:在一个连通图中,选择一些边构成一个树,使得这些边的权值之和最小,同时保证图中的所有节点都能够通过这些边连通。
贪心算法选择每次都选择权值最小的边加入到树中。
然而,这种贪心选择可能会导致最终得到的树不是最小生成树。
4. 背包问题:给定一组物品,每个物品有自己的重量和价值,在给定的背包容量下,选择一些物品放入背包中,使得背包中物品的总价值最大。
贪心算法选择每次都选择单位重量价值最大的物品放入背包中。
然而,在某些情况下,贪心选择可能会导致最终得到的背包价值不是最大的。
5. 最短路径问题:在一个有向图中,找到两个节点之间的最短路径。
贪心算法选择每次都选择距离最近的节点进行扩展。
然而,这种贪心选择可能会导致最终得到的路径不是最短的。
6. 任务调度问题:给定一组任务,每个任务有自己的开始时间和结束时间,在给定的时间段内,选择一些任务进行调度,使得能够完成尽可能多的任务。
贪心算法选择每次都选择结束时间最早的任务进行调度。
然而,在某些情况下,贪心选择可能会导致最终完成的任务数量不是最多的。
遗传算法 最小生成树

遗传算法最小生成树遗传算法什么是遗传算法?遗传算法(Genetic Algorithm,GA)是一种基于生物进化思想的随机化搜索优化方法。
它通过模拟自然界中的进化过程,对问题进行求解。
遗传算法的原理1.个体编码:将问题转换为染色体编码的形式。
2.初始种群:随机生成初始种群。
3.适应度函数:根据问题定义适应度函数,用来评估每个个体的优劣程度。
4.选择操作:按照适应度大小选择部分个体作为下一代的父代。
5.交叉操作:对父代进行交叉操作,生成新的后代。
6.变异操作:对后代进行变异操作,增加种群多样性。
7.重复执行步骤4-6,直到满足终止条件。
遗传算法的优缺点优点:1.全局搜索能力强,可以在大规模搜索空间中找到最优解或次优解;2.适用范围广泛,可以处理多种类型和形式的问题;3.具有较好的并行性和可扩展性;4.易于实现和使用。
缺点:1.需要大量计算资源和时间;2.结果不一定是最优解或次优解;3.对问题的建模需要较高的技能和经验。
最小生成树什么是最小生成树?最小生成树(Minimum Spanning Tree,MST)是一种用来解决带权无向图连通性问题的算法。
它通过在图中选择一些边,使得这些边组成一个树,并且这个树包含所有节点,并且权值之和最小。
最小生成树的原理1.首先,将图中所有边按照权值从小到大排序。
2.从第一条边开始,依次遍历每条边:①如果这条边连接的两个节点不在同一个连通分量中,则将这条边加入最小生成树中;②如果这条边连接的两个节点已经在同一个连通分量中,则不加入最小生成树中。
3.重复执行步骤2,直到所有节点都被包含在最小生成树中。
最小生成树的优缺点优点:1.可以保证所得到的解是全局最优解;2.算法简单易行;3.适用范围广泛。
缺点:1.只适用于带权无向图;2.对于稠密图而言,时间复杂度比较高;3.对于动态变化的图而言,需要重新计算整个最小生成树。
曼哈顿距离最小生成树

曼哈顿距离最小生成树曼哈顿距离最小生成树(ManhattanMinimumSpanningTree)是一种在多维空间(N维空间)里寻找最小代价连接任何两个点的有效算法。
它使用曼哈顿距离作为代价并且能够在多维空间中解决最短路径问题。
曼哈顿距离是一种特殊的距离度量,用来测量在一个N维空间中任意两点之间的距离。
它能够很好地表达在有权重约束的多维空间中任意点之间的最短路径。
曼哈顿距离最小生成树以贪心算法的形式实现,能够有效地解决多维空间中的最短路径问题。
它的核心思想是从一个现有的最小生成树开始,不断的增加新的元素来加强和扩展树的结构。
曼哈顿距离最小生成树的基本步骤如下:(1)从空树开始,任意选取一个节点作为初始节点。
(2)以曼哈顿距离为标准,从剩余的n-1个节点中找出与初始节点距离较近的节点,从而构成一个最小生成树。
(3)重复步骤(2),直至最小生成树中包含所有节点,此时得到了一颗曼哈顿距离最小生成树。
曼哈顿距离最小生成树的一个重要特性是它有一个非常直接的应用:它能够帮助我们解决计算最短路径的问题,也就是计算从某个固定起点到任意终点的最短路径。
使用曼哈顿距离最小生成树来计算最短路径的过程如下:(1)先构造一颗曼哈顿距离最小生成树。
(2)对最小生成树中每条边计算曼哈顿距离,并保存到一个表中。
(3)对最小生成树中每个节点,根据曼哈顿距离计算出从起点到该节点的最短距离,并保存到一个表中。
(4)搜索表中最短路径,找到从起点到终点的最短路径,也就是从起点到终点的最短路径。
曼哈顿距离最小生成树在多维空间中解决最短路径问题时,具有非常强大的功能。
它能够快速、高效地找到任意两点之间的最短路径,而无需考虑权重的约束。
这样,它就成为了一种非常有效的最小代价连接算法,在多维空间中广泛应用。
总的来说,曼哈顿距离最小生成树是在多维空间中解决最短路径问题的一种经典算法。
它使用曼哈顿距离作为代价,能够快速、高效地找到任意两点之间的最短路径,而无需考虑权重的约束。
最小生成树问题例题

最小生成树问题例题最小生成树(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. 如果选取的边连接的两个节点不在同一个连通分量中,就将这条边加入到最小生成树中,并将连接的节点合并为一个连通分量。
4. 重复步骤2和步骤3,直到最小生成树中包含了所有的节点。
使用 Kruskal 算法求解上述例子,我们可以依次选取边 AB、BC、CD、DE、EF 来构建最小生成树。
最终的最小生成树是:A-B、B-C、C-D、D-E 和 E-F 这五条边,它们的权值之和也是12。
最小生成树破圈法

最小生成树破圈法以最小生成树破圈法为标题,我们来探讨一下最小生成树算法中的破圈法。
最小生成树是图论中一种重要的算法,它用于在一个连通带权无向图中找到一棵生成树,使得所有边的权值之和最小。
而破圈法则是最小生成树算法中的一种常用技巧,用于处理可能形成圈的情况,以保证生成树的正确性。
在介绍破圈法之前,我们先简要回顾一下最小生成树的概念和常用算法。
最小生成树是指在一个连通图中找到一棵生成树,使得所有边的权值之和最小。
常见的最小生成树算法有Prim算法和Kruskal 算法。
Prim算法从一个初始顶点开始,逐步扩展生成树,每次选择与生成树相连的边中权值最小的边加入生成树,直到生成树包含所有顶点为止。
而Kruskal算法则是先将所有边排序,然后逐步加入生成树,但要保证加入的边不会形成圈。
然而,在实际应用中,我们常常会遇到一些特殊问题,即图中存在环路。
如果不加以处理,这些环路可能会导致生成树的构建出错。
这时,破圈法就发挥了作用。
破圈法的基本思想是,当我们在生成树构建过程中遇到一条边,它的两个顶点已经在生成树中,并且它们之间还存在一条边,那么我们可以通过删除这条边来破坏环路,以保证生成树的正确性。
具体来说,破圈法的步骤如下:1. 构建一个并查集,用于记录顶点之间的连接关系。
2. 对图中的边按照权值从小到大进行排序。
3. 依次遍历每条边,如果边的两个顶点已经在同一个连通分量中,则说明这条边会形成环路,可以将它删除。
如果不会形成环路,则将这条边加入生成树中。
4. 重复步骤3,直到遍历完所有的边。
通过破圈法,我们可以在生成树的构建过程中,及时地处理可能形成环路的情况,以保证最终生成的树是正确的。
这样,我们就可以得到一个权值和最小的生成树。
最小生成树破圈法的应用非常广泛。
在网络设计、电力传输、城市规划等领域中,往往需要在一个连通图中找到一棵生成树,以便在保证连通性的同时,降低连接成本或者最大程度地节省资源。
而破圈法则是在这个过程中必不可少的一环。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2、最小度限制生成树
2.1、最小度限制生成树的定义 对于一个加权的无向图, 存在一些满足下面性质的生成树: 某个特殊的结点的度等于一 个指定的数值。最小度限制生成树就是满足此性质且权值和最小的一棵生成树。 把它抽象成数学模型就是: 设 G=(V,E,ω)是连通的无向图, v0 ∈V 是特别指定的一个顶点,k 为给定的一个正整数。 如果 T 是 G 的一个生成树且 dT(v0)=k, 则称 T 为 G 的 k 度限制生成树。 G 中权值和最小的 k 度限制生成树称为 G 的最小 k 度生成树。
[解答]这是一个比较明显的度限制生成树的模型,可以把矮人的家和餐地看成图上的点, 两个矮人家之间的距离看成一条带权的无向边,聚餐地为有度限制的点。需要注意的是,本 题是求度不超过 k 的最小生成树, 不过这并没有带来更大的难度, 因为从算法的流程来看我 们很容易得到度不超过 k 的所有最小度限制生成树。
1 最小生成树
1.1 最小生成树的定义 设 G=(V,E,ω)是连通的无向图,G 中权值和最小的生成树称为最小生成树。
1.2 求解最小生成树的算法 求最小生成树,比较常用的算法有 Prim 算法和 Kruskal 算法。前者借助 Fibonacci 堆可 以使复杂度降为 O(Vlog2V+E),后者一般应用于稀疏图,其时间复杂度为 O(Elog2V)。
3、次小生成树
3.1、次小生成树的定义 设 G=(V,E,w)是连通的无向图,T 是图 G 的一个最小生成树。如果有另一棵树 T1,满 足不存在树 T’,ω(T’)<ω(T1) ,则称 T1 是图 G 的次小生成树。 3.2、求解次小生成树的算法 约定: 由 T 进行一次可行交换得到的新的生成树所组成的集合, 称为树 T 的邻集,记为 N(T)。 定理 3:设 T 是图 G 的最小生成树,如果 T1 满足ω(T1)=min{ω(T’)| T’∈N(T)},则 T1 是 G 的次小生成树。 证 明:如 果 T 1 不是 G 的 次小生 成树, 那么 必定 存在另 一个生 成树 T ’, T ’=T 使得 ω(T)≤ω(T’)<ω(T1),由 T1 的定义式知 T 不属于 N(T),则 E(T’)\E(T)={a1,a21,……,at},E(T)\E(T’)={b1,b2,……,bt},其中 t≥2。根据引理 1 知,存在一 个排列 bi1,bi2,……,bit,使得 T+aj-bij 仍然是 G 的生成树,且均属于 N(T),所以ω(aj)≥ω(bij), 所以ω(T’)≥ω(T+aj-bij)≥ω(T1),故矛盾。所以 T1 是图 G 的次小生成树。 通过上述定理,我们就有了解决次小生成树问题的基本思路。 首先先求该图的最小生成树 T。时间复杂度 O(Vlog2V+E) 然后,求 T 的邻集中权值和最小的生成树,即图 G 的次小生成树。 如果只是简单的枚举,复杂度很高。首先枚举两条边的复杂度是 O(VE),再判断该交换是否 可行的复杂度是 O(V),则总的时间复杂度是 O(V2E)。这样的算法显得很盲目。经过简单的 分析不难发现,每加入一条不在树上的边,总能形成一个环,只有删去环上的一条边,才能 保证交换后仍然是生成树,而删去边的权值越大,新得到的生成树的权值和越小。我们可以 以此将复杂度降为 O(VE)。这已经前进了一大步,但仍不够好。 回顾上一个模型——最小度限制生成树, 我们也曾面临过类似的问题, 并且最终采用动态规 划的方法避免了重复计算,使得复杂度大大降低。对于本题,我们可以采用类似的思想。首 先做一步预处理,求出树上每两个结点之间的路径上的权值最大的边,然后,枚举图中不在 树上的边,有了刚才的预处理,我们就可以用 O(1)的时间得到形成的环上的权值最大的边。
定理 2: 设 T 是 G 的最小 k 度限制生成树, E0 是 G 中与 v0 有关联的边的集合, E1=E0\E(T), E2=E(T)\E0,A={(+a,-b)| a∈E1,b∈E2},设ω(a’)-ω(b’)=min{ω(a)-ω(b)| (+a,-b)∈A}, 则 T+a’-b’是 G 的一个最小 k+1 度限制生成树。 如何求最小 k 度限制生成树呢?
最小生成树问题的拓展
摘要 本文主要论述最小生成树问题中的两类拓展——最小度限制生成树和次小生成树。 首
先分别介绍了这两类拓展问题的模型,然后提出了求解这两类问题的算法,最后,通过一些 例子分析其在实际问题中的应用。
关键字 生成树 拓展 度限制
正文
最小生成树是信息学竞赛中的经典问题, 但近年来, 竞赛中的题目不再局限于这类经典 模型,难度大大增加。为解决这些问题,我们必须对这些经典模型加以拓展。拓展的类型很 多,本文主要论述其中的两类——最小度限制生成树和次小生成树。
2.2、求解最小度限制生成树的算法 约定: T 为图 G 的一个生成树, T+a-b 记作(+a,-b), 如果 T+a-b 仍然是一个生成树, 则称(+a,-b) 是 T 的一个可行交换。 引理 1:设 T1,T2 是图 G 的两个不同的生成树, E(T1)\E(T2)={a1,a2, ……,an},E(T2)\E(T1)={b1,b2, …… ,bn}, 则存在一个排序 bi1,bi2, …… ,bin, 使得 T2+ej-fij (j=1,2,……,n)仍然是 G 的生成树。 定理 1:设 T 是 G 的 k 度限制生成树,则 T 是 G 的最小 k 度限制生成树当且仅当下面三 个条件同时成立: Ⅰ 对于 G 中任何两条与 v0 关联的边所产生的 T 的可行交换都是不可改进的。 Ⅱ 对于 G 中任何两条与 v0 不关联的边所产生的 T 的可行交换都是不可改进的。 Ⅲ 对于 T 的任何两个可行交换(+a1,-b1)和(+a2,-b2),若 a1,b2 与 v0 关联,b1,a2 不于 v0 关联,则有ω(b1)+ω(b2)≤ω(a1)+ω(a2) 证明:⑴必要性 设 T 是最小 k 度限制生成树,则Ⅰ,Ⅱ显然成立。 以下证明 Ⅲ:由Ⅰ,Ⅱ 可知如果(+a1,-b2)和(+a2,-b1)都是 T 的可行交换,则有ω(b2)≤ω(a1),ω(b1)≤ω (a2),故ω(b1)+ω(b2)≤ω(a1)+ω(a2); 否则,或者(+a1,-b2)或者(+a2,-b1)不是 T 的 可行交换,根据引理 1,T’=T+{a1,a2}-{b1,b2}仍然是 T 的 k 度限制生成树,则ω (T)≤ω(T’),故ω(b1)+ω(b2)≤ω(a1)+ω(a2)。 ⑵充分性 设 T 是 k 度限制生成树且满足Ⅰ,Ⅱ, Ⅲ, 假如有另一个 k 度限制生成树 T’, ω(T’)<ω(T),设 E(T’)\E(T)={a1,a2,……,an} E(T)\E(T’)={b1,b2,……,bn} 显然有∑ω(ai)<∑ω(bi), 根据引理 1, 存在一个排列 b1’,b2’,……,bn’, 满足 T+ai-bi’ 仍然是 G 的生成树。由ω(T’)<ω(T)得∑(ω(bi’)-ω(ai))>0,因而,在 T 的这 n 个可行交换中,一定存在某个可以改进的交换(+ai,-bi’) 。由于 T 满足Ⅰ,Ⅱ, 则 ai,bi’若同时与 v0 关联或不关联都是不可改进的。也就是说,ai 和 bi’中必定恰好 有一个不与 v0 关联。不妨设 ai 与 v0 无关联,因为 DT’(v0)也等于 k,所以必存在 另一个交换(+aj,-bj’),满足 aj 与 v0 关联, bj’与 v0 无关联, 且(ω(bi’)-ω(ai))+(ω(bj’) -ω(aj))>0,此与Ⅲ矛盾。因此,T’是不存在的,即 T 是 G 的最小 k 度限制生成 树。
下面分别考虑每一步 首先,将 v0 和与之关联的边分别从图中删去,此时的图可能不再连通,对各个连通分量, 分别求最小生成树。 接着, 对于每个连通分量 V’, 求一点 v1, v1∈V’,且ω(v0,v1)=min{ω(v0,v’)| v’∈V’},则该连通分量通过边(v1,v0)与 v0 相连。于是,我们就得到了一个 m 度限制生成树, 不难证明,这就是最小 m 度限制生成树。 这一步的时间复杂度为 O(Vlog2V+E) 我们所求的树是无根树,为了解题的简便,把该树转化成以 v0 为根的有根树。 假设已经得到了最小 p 度限制生成树,如何求最小 p+1 度限制生成树呢? 根据定理 2, 最小 p+1 度限制生成树肯定是由最小 p 度限制生成树经过一次可行交换(+a1,-b1) 得到的。我们自然就有了一个最基本的想法——枚举!但是,简单的枚举,时间复杂度高达 O(E2),显然是不能接受的。深入思考不难发现,任意可行的交换,必定是一条边跟 v0 关联, 另一条与 v0 无关,所以,只要先枚举与 v0 关联的边,再枚举另一条边,然后判断该交换是 否可行,最后在所有可行交换中取最优值即可。于是时间复杂度降到了 O(VE),但这仍然不 能令人满意。进一步分析,在原先的树中加入一条与 v0 相关联的边后,必定形成一个环。 若想得到一棵 p+1 度限制生成树,需删去一条在环上的且与 v0 无关联的边。删去的边的权 值越大,则所得到的生成树的权值和就越小。如果每添加一条边,都需要对环上的边一一枚 举,时间复杂度将比较高,因为有不少边重复统计多次(下图中红色的边统计了多次) 。
这里,动态规划就有了用武之地。设 Best(v)为路径 v0—v 上与 v0 无关联且权值最大的边。 定义 father(v)为 v 的父结点,动态转移方程:Best(v)=max(Best(father(v)),ω(father(v),v)), 边界条件为 Best[v0]=-∞,Best[v’]=-∞| (v0,v’)∈E(T)。 状态共|V|个,状态转移的时间复杂度 O(1),所以总的时间复杂度为 O(V)。 故由最小 p 度限制生成树得到最小 p+1 度限制生成树的时间复杂度为 O(V)。 综上,求最小 k 度限制生成树算法总的时间复杂度为 O(Vlog2V+E+kV)。