0分求助。。。
查看原帖
0分求助。。。
362627
frank15楼主2021/3/6 14:50
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#define P pair<int,int>
using namespace std;
const int maxn=1e6+5,maxm=5e6+5,inf=(1<<31)-1;
int n,m,t,tot,q,U,V;
int f[maxn][20],lg[maxn];
bool vis[maxn];
struct node{
	int depth,top,size,son,father1,dfn,val;
	int father2;
}a[maxn];
struct line{
	int u,v,dis;
}L[maxm];
vector<P> v[maxn]; 
bool cmp(line x,line y){
	return x.dis>y.dis;
}
int find(int k){
	if(a[k].father2==k)
		return k;
	else
		return a[k].father2=find(a[k].father2);
}
void kruskal(){
	sort(L+1,L+m+1,cmp);
	for(int i=1;i<=m;i++){
		int fx=find(L[i].u);
		int fy=find(L[i].v);
		if(fx!=fy){
			a[fx].father2=fy;
			v[L[i].u].push_back(P(L[i].v,L[i].dis));
			v[L[i].v].push_back(P(L[i].u,L[i].dis));
		}
	}
}
void dfs(int k){
	vis[k]=1;
	a[k].size=1;
	a[k].depth=a[a[k].father1].depth+1;
	for(int i=0;i<v[k].size();i++)
		if(v[k][i].first!=a[k].father1){
			a[v[k][i].first].father1=k;
			a[v[k][i].first].val=v[k][i].second;
			dfs(v[k][i].first);
			a[k].size+=a[v[k][i].first].size;
			a[k].son=(!a[k].son||a[a[k].son].size<a[v[k][i].first].size)?v[k][i].first:a[k].son;
		}
}
int dfs2(int k,int TOP){
	f[tot][0]=a[k].val;
	a[k].dfn=++tot;
	a[k].top=TOP;
	if(a[k].son)
		dfs2(a[k].son,a[k].son);
	for(int i=0;i<v[k].size();i++)
		if(v[k][i].first!=a[k].father1&&v[k][i].first!=a[k].son)
			dfs2(v[k][i].first,v[k][i].first);
}
int query(int l,int r){
	int num=r-l+1;
	return max(f[l][lg[num]],f[r-(1<<lg[num])+1][lg[num]]);
}
int LCA(int x,int y){
	int res=inf;
	while(a[x].top!=a[y].top){
		if(a[a[x].top].depth>a[a[y].top].depth){
			res=min(res,query(a[a[x].top].dfn,a[x].dfn-1));
			x=a[a[x].top].father1;	
		}
		else{
			res=min(res,query(a[a[y].top].dfn,a[y].dfn-1));
			y=a[a[y].top].father1;
		}
	}
	if(a[x].depth>a[y].depth)
		return min(res,query(a[y].dfn,a[x].dfn-1));
	else
		return min(res,query(a[x].dfn,a[y].dfn-1));
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
		scanf("%d%d%d",&L[i].u,&L[i].v,&L[i].dis);
	for(int i=1;i<=n;i++){
		a[i].father2=i;
		lg[i]=lg[i-1]+(1<<lg[i-1]==i);
	}
	for(int i=1;i<=n;i++)
		lg[i]--;
	kruskal();
	for(int i=1;i<=n;i++){
		if(!vis[i]){
			dfs(i);
			dfs2(i,i);
		}
	}
	for(int i=1;i<=20;i++)
		for(int j=1;i+(1<<j)-1<tot;j++)
			f[j][i]=min(f[j][i-1],f[j+(1<<(i-1))][i-1]);
	scanf("%d",&q);
	while(q--){
		scanf("%d%d",&U,&V);
		if(a[U].father2!=a[V].father2)
			puts("-1");
		else
			printf("%d\n",LCA(U,V));	
	}
}
2021/3/6 14:50
加载中...