萌新求助0pts 已经调晕了
查看原帖
萌新求助0pts 已经调晕了
127299
Young_Zn_Cu楼主2020/11/4 15:12
#include <bits/stdc++.h>
using namespace std;
const int N=50000+50;
const int Maxn=0x3f3f3f3f;
int cnt,tot,fir[N<<1],f[25][N],dep[N],val[25][N];
int ff[N],n,ans,m,q;
int fff[N];
struct edge{
	int x,y,w;
	int nxt,to;
}e[N<<1],eg[N<<1];
inline int read(){
	int cnt=0,f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-')f=-f;c=getchar();}
	while(isdigit(c)){cnt=(cnt<<1)+(cnt<<3)+(c^48);c=getchar();}
	return cnt*f;
}
inline void adde(int x,int y,int z){eg[++cnt].nxt=fir[x];fir[x]=cnt;eg[cnt].to=y;eg[cnt].w=z;}
void dfs(int u,int fa){
	f[0][u]=fa;dep[u]=dep[fa]+1;
	for(int i=fir[u];i;i=eg[i].nxt){
		int v=eg[i].to;if(v==fa) continue;
		val[0][v]=eg[i].w;
		dfs(v,u);
	}
}
inline int LCA(int x,int y){
	if(dep[x]<dep[y]) swap(x,y);
	for(int i=20;i>=0;--i) if(dep[f[i][x]]>dep[y]) x=f[i][x],ans=min(ans,val[i][x]);
	if(x==y) return ans;
	for(int i=20;i>=0;--i) if(f[i][x]!=f[i][y]) x=f[i][x],y=f[i][y],ans=min(ans,min(val[i][x],val[i][y]));
	ans=min(ans,min(val[0][x],val[0][y]));
	return ans;
}
inline void add(int x,int y,int z){e[++tot].x=x,e[tot].y=y,e[tot].w=z;}
inline bool cmp(const edge &a,const edge &b){return a.w>b.w;}
inline int getfa(int x){return ff[x]==x?x:ff[x]=getfa(ff[x]);}
inline int find(int x){return fff[x]==x?x:fff[x]=find(fff[x]);}
inline void Kruskal(){
	for(int i=1;i<=n;++i) fff[i]=ff[i]=i;
	sort(e+1,e+1+m,cmp);cnt=0;
	for(int i=1;i<=m;++i){
		int x=e[i].x,y=e[i].y,w=e[i].w;
		int fx=getfa(x),fy=getfa(y);
		if(fx==fy) continue;
		adde(x,y,w);adde(y,x,w);
//		fff[find(x)]=find(y);
		ff[fx]=fy;
	}
	return;
}
signed main(){
	n=read(),m=read();
	int x,y,z;
	for(int i=1;i<=m;++i){
		x=read(),y=read(),z=read();
		add(x,y,z);add(y,x,z);
	}
	Kruskal();
	for(int i=1;i<=n;++i)
		if(fff[i]==i)
			val[0][i]=Maxn,dfs(i,i);
	for(int i=1;i<=20;++i){
		for(int j=1;j<=n;++j){
			f[i][j]=f[i-1][f[i-1][j]];
			val[i][j]=min(val[i-1][j],val[i-1][f[i-1][j]]);
		}
	}
	q=read();
	for(int i=1;i<=q;++i){
		ans=Maxn;
		x=read(),y=read();
		if(ff[getfa(x)]!=getfa(y)){
			printf("-1\n");continue;
		}
		int Lca=LCA(x,y);
		printf("%d\n",Lca);
	}
	return 0;
}
2020/11/4 15:12
加载中...