Why RE
查看原帖
Why RE
754467
f_hxr_楼主2023/10/4 17:27

rt

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL maxn=5e5+7;
LL N,M,QWQ,cnt1,cnt;
LL f[maxn],size[maxn],dep[maxn],W[maxn];
LL head[maxn],nxt[maxn],to[maxn],F[23][maxn],Min[23][maxn];
struct Edge{LL u,v,w;}e[maxn];
void add(LL u,LL v,LL w){
	nxt[++cnt]=head[u];to[cnt]=v;head[u]=cnt;W[cnt]=w;
	nxt[++cnt]=head[v];to[cnt]=u;head[v]=cnt;W[cnt]=w;
}
int cmp(Edge x,Edge y){return x.w>y.w;}
LL getf(LL V){
	if(f[V]==V)return V;
	return getf(f[V]);
}
void Merge(LL X,LL Y,LL W){
	X=getf(X);Y=getf(Y);
	if(size[X]>size[Y])swap(X,Y);
	size[Y]+=size[X];f[X]=Y;
}
void dfs(int u,int fa,int www){
	dep[u]=dep[fa]+1;
	F[u][0]=fa;Min[u][0]=www;
	for(int i=1;i<=22;i++){
		F[u][i]=F[F[u][i-1]][i-1];
		Min[u][i]=min(Min[u][i-1],Min[F[u][i-1]][i-1]);
	}
	for(int i=head[u];i;i=nxt[i])
		if(to[i]!=fa)dfs(to[i],u,W[i]);
}
LL CCF(LL u,LL v){
	LL ret=1145141919810;
	if(dep[u]<dep[v])swap(u,v);
	for(int i=22;i>=0;i--){
		if(dep[F[u][i]]>=dep[v])
			ret=min(ret,Min[u][i]),u=F[u][i];
	}
	if(u==v)return ret;
	for(int i=22;i>=0;i--)
		if(F[u][i]!=F[v][i]){
			ret=min(ret,min(Min[u][i],Min[v][i]));
			u=F[u][i],v=F[v][i];
		}
	ret=min(ret,min(Min[u][0],Min[v][0]));
	return ret;
}
int main(){
	scanf("%lld%lld",&N,&M);
	for(int i=1;i<=N;i++)f[i]=i,size[i]=1;
	for(int i=1;i<=M;i++){
		LL x,y,z;cin>>x>>y>>z;
		e[++cnt1].u=x;e[cnt1].v=y;e[cnt1].w=z;
	}
	sort(e+1,e+M+1,cmp);
	for(int i=1;i<=M;i++){
		LL U=e[i].u,V=e[i].v;
		if(getf(U)==getf(V))continue;
		Merge(U,V,e[i].w);add(U,V,e[i].w);
	}
	dfs(1,0,0);
	cin>>QWQ;
	while(QWQ--){
		int u,v;cin>>u>>v;
		if(getf(u)!=getf(v)){cout<<-1<<endl;continue;}
		cout<<CCF(u,v)<<endl;
	}
	return 0;
}
2023/10/4 17:27
加载中...