16pts WA 求调QAQ~
查看原帖
16pts WA 求调QAQ~
757861
User_leo楼主2023/3/4 16:15
#include<bits/stdc++.h>
using namespace std;
int n,m,cnt,cnt1,bf[100010],q;
int f[100010][20],lg[100010],l[100010][20],rt,d[100010];
vector<int>g[100010];
struct edge{
	int from,to,l;
}e[600010];
bool cmp(edge a,edge b){
	return a.l<b.l;
}
int fin(int x){
	return (bf[x]==x?x:bf[x]=fin(bf[x]));
}
bool add(int x,int y){
	x=fin(x),y=fin(y);
	if(x!=y){
		bf[y]=x;
		return 1;
	}
	return 0;
}
void dfs(int x){
	for(int i=0;i<g[x].size();i++){
		int to=g[x][i];
		if(to!=f[x][0]){
			d[to]=d[x]+1;
			dfs(to);
		}
	}
	return ;
}
int LCA(int x,int y){
	int ans=0;
	if(d[x]<d[y]){
		swap(x,y);
	}
	while(d[x]>d[y]){
		ans=max(ans,l[x][lg[d[x]-d[y]]]);
		x=f[x][lg[d[x]-d[y]]];
	}
	if(x==y){
		return ans;
	}
	for(int i=lg[n];i>=0;i--){
		if(f[x][i]!=f[y][i]){
			ans=max(ans,max(l[x][i],l[y][i]));
			x=f[x][i];
			y=f[y][i];
		}
	}
	ans=max(ans,max(l[x][0],l[y][0]));
	return ans;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		bf[i]=i;
	}
	for(int i=1;i<=m;i++){
		int x,y,z;
		cin>>x>>y>>z;
		e[++cnt]={x,y,z};
		e[++cnt]={y,x,z};
	}
	sort(e+1,e+m*2+1,cmp);
	for(int i=1;i<=2*m;i++){
		if(add(e[i].from,e[i].to)){
			f[e[i].to][0]=e[i].from;
			l[e[i].to][0]=e[i].l;
			g[e[i].from].push_back(e[i].to);
			cnt1++;
			if(cnt1==n-1){
				break;
			}
		}
	}
	lg[0]=-1;
	for(int i=1;i<=n;i++){
		lg[i]=lg[i>>1]+1;
		if(f[i][0]==0){
			rt=i;
		}
	}
	dfs(rt);
	for(int i=1;i<=lg[n];i++){
		for(int j=1;j<=n;j++){ 
			f[j][i]=f[f[j][i-1]][i-1];
			l[j][i]=max(l[j][i-1],l[f[j][i-1]][i-1]);
		}
	}
	cin>>q;
	while(q--){
		int x,y;
		cin>>x>>y;
		cout<<LCA(x,y)<<"\n";
	}
	return 0;
}
2023/3/4 16:15
加载中...