100分求调
查看原帖
100分求调
1094030
yr409892525楼主2024/9/5 08:50
#include<bits/stdc++.h>
using namespace std;
const int N=5e4+5;
int n,m;
struct code{
	int u,v,x;
};
vector<code> edge,op[N];
int fa[N];
code k[N];
int dis[N];
bool cmp(code x,code y){
	return x.x>y.x;
}
int find(int x){
	if(x==fa[x]) return x;
	return find(fa[x]);
}
void unionn(int x,int y){
	x=find(x);
	y=find(y);
	fa[x]=y;
	return ;
}
void init(){
	for(int i=1;i<=n;i++){
		fa[i]=i;
	}
	for(int i=0;i<m;i++){
		int u=edge[i].u;
		int v=edge[i].v;
		if(find(u)!=find(v)){
			unionn(u,v);
			op[u].push_back({u,v,edge[i].x});
			op[v].push_back({v,u,edge[i].x});
		}
	}
	return ;
}
void father(int u,int f){
	dis[u]=dis[f]+1;
	for(int i=0;i<op[u].size();i++){
		int v=op[u][i].v;
		if(v==f) continue;
		k[v]={v,u,op[u][i].x};
		father(v,u);
	}
	return ;
}
int lca(int x,int y){
	int mn=1e9;
	if(dis[x]<dis[y]) swap(x,y);
	int p=dis[x]-dis[y];
	for(int i=1;i<=p;i++){
		mn=min(mn,k[x].x);
		x=k[x].v; 
	}
	int sum=0;
	while(x!=y){
		sum++;
		mn=min(mn,k[x].x);
		mn=min(mn,k[y].x);
		x=k[x].v;
		y=k[y].v;
		if(sum>n) return -1;
	}
	return mn;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int u,v,x;
		cin>>u>>v>>x;
		edge.push_back({u,v,x});
	}
	sort(edge.begin(),edge.end(),cmp);
	init();
	k[1]={1,1,0};
	father(1,0);
	int q;
	cin>>q;
	while(q--){
		int x,y;
		cin>>x>>y;
		cout<<lca(x,y)<<"\n";
	}
	return 0;
}

Hack过不去

2024/9/5 08:50
加载中...