萌新刚学OI,5pts请求DEBUG
查看原帖
萌新刚学OI,5pts请求DEBUG
922691
Hisy楼主2024/7/20 21:57
#include<bits/stdc++.h>
#define MAXN 10001
#define MAXM 50005
#define INF 2147483647
using namespace std; 
struct node1{
	int head,tail,dis;
}a[MAXM];
struct node2{
	int to,next,dis;
}edge[MAXM<<1];
int n,m,q,cnt,head[MAXN],deep[MAXN],parent[MAXN][22],dis[MAXN][22],fa[MAXN];
bool visit[MAXN];
inline void addedge(int from,int to,int dis){
	edge[++cnt].next=head[from];
	edge[cnt].to=to;
	edge[cnt].dis=dis;
	head[from]=cnt;
}
inline bool cmp(const node1 &x,const node1 &y){
	return x.dis>y.dis;
}
inline int get(int x){
	if(fa[x]==x){
		return x;
	}
	return fa[x]=get(fa[x]);
}
inline void kruskal(){
	sort(a+1,a+m+1,cmp);
	for(int i=1;i<=n;++i){
		fa[i]=i;
	}
	for(int i=1;i<=m;++i){
		if(get(a[i].head)!=get(a[i].tail)){
			fa[get(a[i].head)]=get(a[i].tail);
			addedge(a[i].head,a[i].tail,a[i].dis);
			addedge(a[i].tail,a[i].head,a[i].dis);
		}
	}
}
inline void dfs(int now){
	visit[now]=true;
	for(int i=head[now];i;i=edge[i].next){
		int to=edge[i].to;
		if(visit[to]){
			continue;
		}
		deep[to]=deep[now]+1;
		parent[to][0]=now;
		dis[to][0]=edge[i].dis;
		dfs(to);
	}
}
inline int lca(int x,int y){
	if(get(x)!=get(y)){
		return -1;
	}
	int ans=INF;
	if(deep[x]>deep[y]){
		swap(x,y);
	}
	for(int i=20;i>=0;--i){
		if(deep[parent[y][i]]){
			ans=min(ans,dis[y][i]);
			y=parent[y][i];
		}
	}
	if(x==y){
		return ans;
	}
	for(int i=20;i>=0;--i){
		if(parent[x][i]!=parent[y][i]){
			ans=min(ans,min(dis[x][i],dis[y][i]));
			x=parent[x][i];
			y=parent[y][i];
		}
	}
	ans=min(ans,min(dis[x][0],dis[y][0]));
	return ans;
}
int main(){
	scanf("%d %d",&n,&m);
	for(int i=1;i<=m;++i){
		int x,y,dis;
		scanf("%d %d %d",&x,&y,&dis);
		a[i].head=x;
		a[i].tail=y;
		a[i].dis=dis;
	}
	kruskal();
	for(int i=1;i<=n;++i){
		if(!visit[i]){
			deep[i]=1;
			dfs(i);
			parent[i][0]=1;
			dis[i][0]=INF;
		}
	}
	for(int i=1;i<=20;++i){
		for(int j=1;j<=n;++j){
			parent[j][i]=parent[parent[j][i-1]][i-1];
			dis[j][i]=min(dis[j][i-1],dis[parent[j][i-1]][i-1]);
		}
	}
	scanf("%d",&q);
	while(q--){
		int x,y;
		scanf("%d %d",&x,&y);
		printf("%d\n",lca(x,y));
	}
	return 0;
}
2024/7/20 21:57
加载中...