不明白为啥还要在路径上取最大值,两点之间重构树的lca不就是最小路径最大值吗?请大佬教教蒟蒻。
#include<bits/stdc++.h>
using namespace std;
#define rep(i,l,r) for(int i=(l);i<=(r);++i)
#define pre(i,l,r) for(int i=(l);i>=(r);--i)
const int N=1e5+5;
int vl[N],n,m,fa[N],rt=0,f[N][20],dep[N],q;
vector<int> g[N];
struct node{
int u,v,w;
}e[N];
bool operator<(const node&x,const node&y){
return x.w>y.w;
}
inline void dfs1(int u,int fat){
f[u][0]=fat;dep[u]=dep[fat]+1;
for(auto it:g[u]){
if(it^fat){
dfs1(it,u);
}
}
}
inline int lca(int u,int v){
if(dep[u]<dep[v]) swap(u,v);
pre(i,19,0){
if(dep[u]-(1<<i)>=dep[v]){
u=f[u][i];
}
}
if(u==v) return u;
pre(i,19,0){
if(f[u][i]^f[v][i]){
u=f[u][i];v=f[v][i];
}
}
return f[u][0];
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin>>n>>m;
auto suf=[&](auto&& find,int x)->int{
if(x==fa[x]) return x;
return fa[x]=find(find,fa[x]);
};
rep(i,1,m){
cin>>e[i].u>>e[i].v>>e[i].w;
}
rep(i,1,n) fa[i]=i;
sort(e+1,e+m+1);
rt=n;
rep(i,1,m){
int u=suf(suf,e[i].u),v=suf(suf,e[i].v);
if(u^v){
vl[++rt]=e[i].w;
fa[u]=fa[v]=fa[rt]=rt;
g[rt].push_back(u);
g[u].push_back(rt);
g[rt].push_back(v);
g[v].push_back(rt);
}
}
dfs1(rt,0);
rep(j,1,19) rep(i,1,n) f[i][j]=f[f[i][j-1]][j-1];
cin>>q;
rep(i,1,q){
int u,v;
cin>>u>>v;
if(suf(suf,u)^suf(suf,v)){
cout<<"-1\n";
}else{
cout<<vl[lca(u,v)]<<'\n';
}
}
return 0;
}
//tomxi