Kruskal+LCA 0pts求调
查看原帖
Kruskal+LCA 0pts求调
477821
toolong114514楼主2023/11/11 17:33
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
const int INF=0x7fffffff;
const int N=5e5+10;
struct node{
	int to,nxt,val;
}edge[N];
int cnt;
int head[N];
void add(int u,int v,int w){
	edge[++cnt]={v,head[u],w};
	head[u]=cnt;
}
struct fuck{
	int fr,to,val;
}edl[N];
bool cmp(fuck pre,fuck nxt){
	return pre.val>nxt.val;
}
int fa[N];
int find(int x){
	if(fa[x]==x) return x;
	else return fa[x]=find(fa[x]);
}
void connect(int x,int y){
	fa[find(x)]=find(y);
}
bool vst[N];
int dep[N];
int vv[N][30];
int st[N][30];
void build(int pos,int last,int minn){
	vst[pos]=true;
	st[pos][0]=last;
	dep[pos]=dep[last]+1;
	vv[pos][0]=minn;
	for(int i=head[pos];i!=-1;i=edge[i].nxt){
		if(edge[i].to!=last) build(edge[i].to,pos,edge[i].val);
	}
}
int n,m,q;
int main(){
	memset(head,-1,sizeof(head));
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		fa[i]=i;
	}
	for(int i=1;i<=m;i++){
		cin>>edl[i].fr>>edl[i].to>>edl[i].val;
	}
	sort(edl+1,edl+m+1,cmp);
	for(int i=1;i<=m;i++){
		if(find(edl[i].fr)!=find(edl[i].to)){
			connect(edl[i].fr,edl[i].to);
			add(edl[i].fr,edl[i].to,edl[i].val);
			add(edl[i].to,edl[i].fr,edl[i].val);
		}
	}
	for(int i=1;i<=n;i++){
		if(!vst[i]) build(i,i,INF);
	}
	for(int j=1;j<=19;j++){
		for(int i=1;i<=n;i++){
			if((1<<j)<=dep[i]){
				st[i][j]=st[st[i][j-1]][j-1];
				vv[i][j]=min(vv[i][j-1],vv[st[i][j-1]][j-1]);
			}
		}
	}
	cin>>q;
	while(q--){
		int a,b;
		cin>>a>>b;
		if(find(a)!=find(b)){
			cout<<"-1\n";
			continue;
		}
		int ans=INF;
		if(dep[a]<dep[b]) swap(a,b);
		int len=dep[a]-dep[b];
		for(int i=19;i>=0;i--){
			if((1<<i)<=dep[a]-dep[b]){
				a=st[a][i];
				ans=min(ans,vv[a][i]);
			}
		}
		if(a==b){
			cout<<a<<endl;
			continue;
		}
		for(int i=20;i>=0;i--){
			if((1<<i)<=dep[a]&&st[a][i]!=st[b][i]){
				ans=min(ans,min(vv[a][i],vv[b][i]));
				a=st[a][i];
				b=st[b][i];
			}
		}
		cout<<min(ans,min(st[a][0],st[b][0]))<<endl;
	}
	return 0;
}
2023/11/11 17:33
加载中...