传送门:https://www.luogu.org/problemnew/show/P1967
带权LCA,模板题。
和fa[now][0]一样,w[now][0]表示父节点的权值。
更新w[now][i]的时候要从w[now][0]开始更新,因为上一次记录的是w[now][0],因为这个没写好错了很多次。
然后就是结点往上爬的时候更新w权值。
奥奥,为什么这个题跑一下LCA就可以了呢。
题目要求是找一条最小边的最大值,dijkstra+二分直接炸了,只有10分,跑了2W MS。
下面说说算法的正确性。
既然是最小边的最大值,那我们就直接按照边权排序构造一个最大生成树,这样显然可以保证最小值最大。
然后我们在最大生成树上跑LCA,因为在最大生成树上,任意两个点之间有且仅有一条路径,所以我们从起点和终点找LCA,然后更新一下两边最小的边权,就相当于从起点到终点的边权的最小值啦。
细节比较多,其实也没啥难度(装傻)
下面上代码:
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 1e5+7;
const int maxl = 21;
int n,m;
int depth[maxn],fa[maxn][maxl];
int w[maxn][maxl];
int