10pts 求调
查看原帖
10pts 求调
684245
zhangyaiwei楼主2025/1/19 11:46
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct ed{
	int x,y,z;
}es[51111];
int n,m,q,x,y,dep[11111],f[11111],mx[21][11111],fa[21][11111];
vector<pair<int,int> > v[11111];
int cmp(ed a,ed b){
	return a.z>b.z;
}
int Ff(int x){
	if(f[x]==x) return x;
	return f[x]=Ff(f[x]);
}
void Dfs(int x,int deep){
	dep[x]=deep;
	for(int i=0;i<v[x].size();i++){
		int sn=v[x][i].first;
		if(fa[0][x]==sn) continue;
		fa[0][sn]=x;
		mx[0][sn]=v[x][i].second;
		Dfs(sn,deep+1);
	}
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		f[i]=i;
	}
	for(int i=1;i<=m;i++){
		cin>>es[i].x>>es[i].y>>es[i].z;
	}
	sort(es+1,es+1+m,cmp);
	for(int i=1;i<=m;i++){
		int Fx=Ff(es[i].x),Fy=Ff(es[i].y);
		if(Fx!=Fy){
			v[es[i].x].push_back(make_pair(es[i].y,es[i].z));
			v[es[i].y].push_back(make_pair(es[i].x,es[i].z));
			f[Fx]=Fy;
		}
	}
	for(int i=1;i<=n;i++){
		// cout<<mx[0][i]<<" ";
		if(!dep[i]){
			fa[0][i]=i;
			Dfs(i,1);
		}
	}
	// cout<<endl;
	for(int i=1;i<=20;i++){
		for(int j=1;j<=n;j++){
			fa[i][j]=fa[i-1][fa[i-1][j]];
			mx[i][j]=min(mx[i-1][j],mx[i-1][fa[i-1][j]]);
		}
	}
	cin>>q;
	while(q--){
		int ans=1145141919810;
		cin>>x>>y;
		if(Ff(x)!=Ff(y)){
			cout<<"-1\n";
			continue;
		}
		if(dep[x]!=dep[y]){
			if(dep[x]<dep[y]) swap(x,y);
			for(int i=20;i>=0;i--){
				if(dep[fa[i][x]]>dep[y]){
					ans=min(ans,mx[i][x]);
					x=fa[i][x];
				}
			}
			ans=min(ans,mx[0][x]);
			x=fa[0][x];
		}
		if(x==y){
			cout<<ans<<endl;
			continue;
		}
		for(int i=20;i>=0;i--){
			if(fa[i][x]!=fa[i][y]){
				x=fa[i][x];
				y=fa[i][y];
				ans=min(ans,min(mx[i][x],mx[i][y]));
			}
		}
		ans=min(ans,min(mx[0][x],mx[0][y]));
		cout<<ans<<endl;
	}
}
2025/1/19 11:46
加载中...