10分蒟蒻求助
查看原帖
10分蒟蒻求助
578006
Lizsama楼主2022/12/17 12:42
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<queue>
#include<stack>
using namespace std;
const int N=100000+5,M=500000+5;
int n,m,q,idx;
int fa[N],p[N],deep[N];
vector<int>v[N];
struct node{
	int x,y,z;
}a[M];
struct node1{
	int fa,mn;
}f[N][20];
bool cmp(node x,node y)
{
	return x.z>y.z;
}
int g(int x)
{
	if(fa[x]==x)return x;
	else return fa[x]=g(fa[x]);
}
void bfs(int x,int d)
{
	deep[x]=d;
	for(int i=0;i<v[x].size();i++)
	{
		bfs(v[x][i],d+1);
	}
}
void init()
{
	for(int i=1;i<=n;i++)
	{
		fa[i]=i;
	}
	sort(a+1,a+1+m,cmp);
	for(int i=1;i<=m;i++)
	{
		int tp1=g(a[i].x),tp2=g(a[i].y);
		if(tp1!=tp2)
		{
			fa[tp1]=tp2;
			p[++idx]=i;
		}
	}	
	for(int j=0;j<=19;j++)
	{
		for(int i=1;i<=n;i++)
		{
			f[i][j].mn=99999999;
		}
	} 
	for(int i=1;i<=idx;i++)
	{
		int tp1=a[p[i]].x,tp2=a[p[i]].y;
		if(f[tp1][0].fa!=0)
		{
			swap(tp1,tp2);
		}
		f[tp1][0].fa=tp2;
		f[tp1][0].mn=a[p[i]].z;
		v[tp2].push_back(tp1);
	}
	for(int i=1;i<=n;i++)
	{
		if(f[i][0].fa==0)
		{
			f[i][0].fa=i;
			bfs(i,0);
		}
	}	
	for(int j=1;j<=19;j++)
	{
		for(int i=1;i<=n;i++)
		{
			f[i][j].fa=f[f[i][j-1].fa][j-1].fa;
			f[i][j].mn=min(f[i][j-1].mn,f[f[i][j-1].fa][j-1].mn);
		}
	}
}
int lca(int a,int b)
{
	if(g(a)!=g(b))return -1;
	if(deep[a]<deep[b])swap(a,b);
	int s=deep[a]-deep[b];
	int ans=99999999;
	for(int i=0;i<=19;i++)
	{
		if((1<<i)&s)
		{
			ans=min(ans,f[a][i].mn);
			a=f[a][i].fa;
		}
	}
	if(a==b)return ans;
	for(int i=19;i>=0;i--)
	{
		if(f[a][i].fa!=f[b][i].fa)
		{
			ans=min(ans,min(f[a][i].mn,f[b][i].mn));
			a=f[a][i].fa;
			b=f[b][i].fa;		
		}
	}
	ans=min(ans,min(f[a][0].mn,f[b][0].mn));
	return ans;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
	}
	init();
	scanf("%d",&q);
	while(q--)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		printf("%d\n",lca(a,b));
	}
	return 0;
}
2022/12/17 12:42
加载中...