5pts 求助
查看原帖
5pts 求助
483826
joker_zjd楼主2022/8/6 08:47
#include<bits/stdc++.h>
using namespace std;
int n,m,x,y,z;
struct code{
	int u,v,num;
}asd[1000000];
struct node{
	int to,num;
};
int f[10001];
int lca[10001][40];
int ans[10001][40];
bool cmp(code A,code B){
	return A.num>B.num;
}
vector<node>q[10001];
int F(int GF){
	if(f[GF]==GF)return GF;
	return f[GF]=F(f[GF]);
}
bool opi[100001];
int sid[100001];
void awe(int number){
	opi[number]=1;
	for(int i=1;i<=35;i++){
		lca[number][i]=lca[lca[number][i-1]][i-1];
		ans[number][i]=min(ans[number][i-1],ans[lca[number][i-1]][i-1]);
	}
	for(node i:q[number]){
		if(opi[i.to]==0){
			awe(i.to);
			sid[i.to]=sid[number]+1;
			lca[i.to][0]=number;
			ans[i.to][0]=i.num;
		}
	}
	return;
}
int Q,A,B;
int main(){
	cin>>n>>m;
	memset(ans,20,sizeof(ans));
	for(int i=1;i<=m;i++){
		cin>>x>>y>>z;
		asd[i]=code{x,y,z};
	}
	for(int i=1;i<=n;i++)f[i]=i;
	sort(asd+1,asd+m+1,cmp);
	for(int i=1;i<=m;i++){
		if(F(asd[i].u)!=F(asd[i].v)){
			f[F(asd[i].u)]=F(asd[i].v);
			q[asd[i].u].push_back(node{asd[i].v,asd[i].num});
			q[asd[i].v].push_back(node{asd[i].u,asd[i].num});
		}
	}
	sid[1]=1;
	awe(1);
	cin>>Q;
	sid[0]=9999999999;
	for(int i=1;i<=Q;i++){
		int ans_=9999999999;
		cin>>A>>B;
		if(F(A)!=F(B)){
			cout<<-1<<endl;
			continue;
		}
		if(sid[A]<sid[B])swap(A,B);
		for(int o=0;o<=30;o++){
			if(sid[lca[A][o]]<=sid[B]){
				ans_=min(ans[A][o],ans_);
				A=lca[A][o];
			}
		}
		for(int o=30;o>=0;o--){
			if(lca[A][o]!=lca[B][o]){
				ans_=min(ans_,min(ans[A][o],ans[B][o]));
				A=lca[A][o];
				B=lca[B][o];
			}
		}
		if(A!=B){
			ans_=min(ans_,min(ans[B][0],ans[A][0]));
			A=lca[A][0];
			B=lca[B][0];
		}
		cout<<ans_<<endl;
	}
	return 0;
}
2022/8/6 08:47
加载中...