5pts求调悬关,kruskal重构树
查看原帖
5pts求调悬关,kruskal重构树
929151
xxr___楼主2025/1/7 23:10

不明白为啥还要在路径上取最大值,两点之间重构树的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
2025/1/7 23:10
加载中...