为什么会编译失败
查看原帖
为什么会编译失败
1019257
zhaojiawei1234444楼主2024/7/14 17:09

p1967

#include<bits/stdc++.h>
using namespace std;
const int N=5e4+50;
int n,m,q,p[N];
int tot,head[N],next[N<<1],to[N<<1],w[N<<1];
struct Edge{
	int x,y,w;
}e[N];
bool cmp(Edge x,Edge y){
	return x.w>y.w;
}
void add(int x,int y,int val){
	to[tot]=y;
	w[tot]=val;
	next[tot]=head[x];
	head[x]=tot++;
}
int get(int x){
	return p[x]==x?x:p[x]=get(p[x]);
}
int deep[N];
int f[N][21],v[N][21];
void dfs(int x){
	for(int i=head[x];~i;i=next[i]){
		if(to[i]!=f[x][0]){
			deep[to[i]]=deep[x]+1;
			f[to[i]][0]=x;
			v[to[i]][0]=w[i];
			dfs(to[i]);
		}
	}
}
int get_lca_w(int x,int y){
	int res=INT_MAX;
	if(deep[x]<deep[y]){
		swap(x,y);
	}
	for(int i=20;i>=0;i--){
		if(deep[x]-(1<<i)>=deep[y]){
			res=min(res,v[x][i]);
			x=f[x][i];
		}
	}
	if(x==y) return res;
	for(int i=20;i>=0;i--){
		if(f[x][i]!=f[y][i]){
			res=min(v[x][i],v[y][i]);
			x=f[x][i];
			y=f[y][i];
		}
	}
	return min(res,min(v[x][0],v[y][0]));
}
int main(){
	memset(head,-1,sizeof head);
	ios::sync_with_stdio();
	cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>e[i].x>>e[i].y>>e[i].w;
	}
	sort(e+1,e+m+1,cmp);
	for(int i=1;i<=n;i++){
		p[i]=i;
	}
	for(int i=1;i<=m;i++){
		int x=get(e[i].x);
		int y=get(e[i].y);
		if(x==y) continue;
		p[x]=y;
		add(e[i].x,e[i].y,e[i].w);
		add(e[i].y,e[i].x,e[i].w);
	}
	for(int i=1;i<=n;i++){
		if(!f[i][0]){
			dfs(i);
		}
	}
	for(int j=1;j<=20;j++){
		for(int i=1;i<=n;i++){
			f[i][j]=f[f[i][j-1]][j-1];
			v[i][j]=min(v[i][j-1],v[f[i][j-1]][j-1]);
		}
	}
	cin>>q;
	while(q--){
		int x,y;
		cin>>x>>y;
		if(get(x)!=get(y)) puts("-1");
		else cout<<get_lca_w(x,y)<<endl;
	}
	return 0;
}
2024/7/14 17:09
加载中...