最小瓶颈路 和 次小生成树

简介

最小生成树是图论里面一类经典问题,可以有很多种变形,其中最小瓶颈路和次小生成树就是两种比较经典的变形。最小瓶颈路就是在两个结点之间求一条最长边最短的路径,而次小生成树则是所有生成树中权值排名第二的生成树(可以和最小生成树相等)(当然也有一个问题是求严格的次小生成树, 那么这个有不同了, 详情看这类的上一篇博客)

最小瓶颈路:

给定一个加权无向图,并给定无向图中两个结点u和v,求u到v的一条路径,使得路径上边的最大权值最小。这个问题可以稍微加强一下,即求很多对结点之间的最小瓶颈路。
无向图中,任意两个结点的最小瓶颈路肯定在最小生成树上。因此, 我们可以先求出最小生成树,然后从结点u对最小生成树进行DFS直到访问到结点v,DFS过程中就可以求出最长边。这种方法非常简单,但是效率就不够高,如果结点对很多的话,我们每次都对最小生成树进行DFS就会很慢了(一次时间O(n)) 但是这样不管是求一次还是多次询问都不是最优的。
如果是单纯求一次, 我们可以通过并查集从大到小贪心的并, 然后每次判断要连的两个点是否联通, 能联通此时的就是答案 因为我们从大可以保证尽量的大, 此时能联通就是最大的最小了. 这样也是最优最好写的方法.
但是对于多次询问的, 这样显然显得很慢, 所以那个先求出最小生成树可以提供一个思路. 求出后我们预处理这颗树, 根据数据量可以有两个算法,
一是用LCA倍增维护树上任意两点之间最大的边, 可以做到nlogn的处理, logn的回答. 对于点多边多的非常适用.
二是用dp维护, dp[i][j]代表树上点i 到 j 的最大边, O(n^2)的预处理, 可以做到O(1)的回答. 对于点的数量小于5000的还是挺适用的…. 空间消耗大….
模板一(LCA倍增):

// LCA
const int maxn = 2e5 + 5;
int up[maxn][23], maxx[maxn][23];
int deep[maxn], dis[maxn];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值