【题意】q个询问,求x到y的路径中最大值的最小值。
【思路】跟货车运输一样。两点间最大值的最小值一定在最小生成树的边上。kruskal最小生成树跑一边加入一条边使得两个不相连的的点相连时,这条边即是所求边。并查集维护将最小生成树转化为LCA。
【一个定理】
定理:图G的(s,t)之间的最小最大边,一定是其在最小生成树中(s,t)的路径上的最大边。
证明:反证法,设(s,t)之间的最小最大边权值为minW。
1.假设最小生成树中(s,t)的路径上的最大边maxW<minW。则跟minW是所有s-t路径的最小值矛盾。
2.假设最小生成树中(s,t)的路径上的最大边maxW>minW。则跟maxW是最小生成树的边矛盾,因为在添加maxW之前minW已经添加了。
【方法1】转成LCA+RMQ
于是我们可以先构造出这个图的一棵最小生成树。
然后问题就转为求树上任意两点的最大边权
LCA+RMQ
【算法】求二叉树上任意两点的最短路径上的边权最大值
【问题】给出一棵树,每条边有一边权。对于任意给定的两点,求此两点的最短路径上边权的最大值。
对于下图:
蓝圈中任意一点与红圈中任意一点的路径上的最大边必定是8。
根据这个现象,可以把上述的树重建成如下图所示。
新图的叶子结点为原图的所有结点,内部结点为原图的边权,建边顺序为从小到大。如图所示:
新图的红色编号为原图的结点编号,蓝色编号为原图的边。
这样,问题就转换为求新图中,任意两个叶子节点的最小公共祖先问题了。
【分析时间复杂度】:
对于一棵树,n个结点,m条边,n=m-1。
1、对所有的边进行排序:O(mlgm);
2、建图采用并查集维护集合,并查集当前集合的根结点时间复杂度平均为O(1),建图一共要建立n+m个点,所以时间复杂度为O(n+m);
3、查询任意两个结点的最近公共祖先,采用RMQ处理,预处理的时间复杂度为O(n+m),回答时间复杂度为O(1);
所以,总的时间复杂度O(nlogn)。