生成树相关问题整理

摘要:
在对最小生成树算法有一定理解后,我们对典型的最小生成树题型应该不难解决,但是对于由最小生成树模型变形而来的几种模型,我们仍需做一次总结与记录。
首先我们需要提出最小生成树几个性质,便于推导算法;然后我们将介绍6种最小生成树相关问题模型,并讨论一般解法与更优解法;其中有的解法显而易见,接受起来也很简单,但有的解法却需要从理论上逻辑严密的进行推导,构造算法并证明算法的正确性,这部分难度稍大。
这6个相关问题分别是:增量最小生成树,最小瓶颈生成树,最小瓶颈路,每对节点的最小瓶颈路,次小生成树,最小有向生成树。

图论中的2个性质:

  • 切割性质: 假定所有边权均不相同。设S为既非空集也非全集的V的子集,边e是满足一个端点在S内,另一个端点不在S内的所有边中权值最小的一个,则图G的所有生成树均包含e。
  • 回路性质: 假定所有边权值均不相同。设C是图G中任意回路,边e是C上权值最大的边,则图G的所有生成树均不包含e。

在此不给出证明。

增量最小生成树

问题描述:
从包含n个点的空图开始,依次加入m条带权边。每加入一条边,输出当前图中的最小生成树权值(如果当前图不连通,则输出无解)。
解题思路:
如果每次重新求完整的最小生成树问题,总时间复杂度高达O(m^2 log n)。根据回路的性质,可以得到如下改进算法:

每次求出新的最小生成树后,把其它的边删除。由于每次只需计算一个n条边(原生成树有 n - 1条,新加入一条)的图的最小生成树,Kruskal算法的时间复杂度降为O(n log n),总时间复杂度为O(nm log n)。

这个算法可以进一步改进:

加入一条边e = (u, v)之后,图中恰好包含一个环。根据回路性质,删除该回路上权值最大的边即可,因此只需在加边之前的MST上找到u到v的唯一路径上的权值最大的边,再和e比较,删除权值较大的一条。由于路径唯一,可以用DFS或BFS找到这条u到v的路径,总时间复杂度为O(nm)。

最小瓶颈生成树

问题描述:
给出加权无向图,求一棵生成树,使得最大边权值尽量小。

解题思路:
由于只关心最大边权值,我们可以从一个空图开始,按照权值从小到大的顺序依次加入各条边,则图第一次连通时,该图的最小生成树就是原图的最小瓶颈生成树。可以发现,原图的最小生成树就是一棵最小瓶颈生成树(但不是每棵最小瓶颈生成树都是最小生成树)。

最小瓶颈路

问题描述:
给定加权无向图的两个节点u和v,求出从u到v的一条路径,使得路径上最长边尽量短。

解题思路:
这个问题可以用二分法+BFS解决,但我们有更好的算法。先求出这个图的最小生成树,则起点和终点在树上的唯一路径就是我们要找的路径,这条路径上的最长边就是问题的答案。

每对结点间的最小瓶颈路

问题描述:
给出加权无向图,求每两个节点u和v之间的最小瓶颈路的最大边长f(u,v)。

解题思路:

先求最小生成树。接下来,用DFS把最小生成树变成有根树,同时计算f(u,v),当新访问一个节点u时,考虑所有已经访问过的老节点x,更新f(x,u) = max(f(x,v) , w(u,v)),其中v是u的父节点。每个f(u,v)只需经过常数时间计算,因此是时间复杂度为O(n^2)。

次小生成树

问题描述:
把所有生成树按照权值之和从大到小的顺序排列,求排在第二位的生成树。注意,如果最小生成树不唯一,次小生成树的权值与最小生成树相同。

解题思路:

次小生成树不会与最小生成树完全相同,因此可以枚举最小生成树中不在次小生成树中出现的边。注意最小生成树只有n-1条边,所以只需枚举n-1次。每次在剩下的边里求一次最小生成树,则这n-1棵“缺一条边的图”的最小生成树中权最小的就是原图的次小生成树。

还有一种更好的方法:

枚举要加入哪条新边。在最小生成树上加一条边u-v之后,图上会出现一条回路,因此删除的边必须在最小生成树上u到v的路径上,且是这条路径上的最长边。可以证明,次小生成树一定可以由最小生成树加一条边再删一条边得到(称为边交换),因此只需按照“每对节点之间的最小瓶颈路”的方法求出每对节点u和v在最小生成树中唯一路径的最大边权maxcost[u][v],则剩下的部分只需要O(m)时间(枚举所有m-n+1条边进行交换,每次花O(1)时间求出新生成树的权值)。总时间复杂度为O(n^2)。

最小有向生成树

问题描述:
给定一个有向带权图G和其中一个节点u,找出一个以u为根节点,权和最小的有向生成树。有向生成树(directed spanning tree)也叫树形图(arborescence),是指一个类似树的有向图,满足以下条件:

  • 恰好有一个入度为0的点,称为根节点
  • 其它节点的入度均为1
  • 可以从根节点到达其它所有节点

不难发现,如果树形图的节点数为n,它的边数一定为n-1,且树形图中不存在有向环。

解题思路:
固定根的最小树形图可以用朱-刘算法解决。

首先是预处理,删除自环并判断根节点是否可以到达其它所有节点。如果不是,输出无解并终止程序。
接下来是算法的主过程:
首先,给所有非根节点选择一条权最小的入边。如果选出来的n-1条边不构成圈,则可以证明这些边就形成了一个最小树形图,否则把每个圈各收缩成一个点,继续上述过程。
缩圈之后,圈上所有边都消失了,因此在最终答案里需要加上这些边权之和。但这样做有个问题:假设在算法的某次迭代中,把圈C收缩为人工节点v,则在下一次迭代中,给v选择的入弧将与在圈C中的入弧发生冲突。(假设X在圈中已经有了入弧Y->X)因此如果收缩之后又选了一个入弧Z->X,必须把弧Y->X从最小树形图中删除。这等价于把弧Z->X的权值减少了Y->X的权值。

参考书目
  • 刘汝佳,算法竞赛入门经典训练指南,北京:清华大学出版社,2012,343-344
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 程序猿惹谁了 设计师:白松林 返回首页