蒟蒻求助,85WA
查看原帖
蒟蒻求助,85WA
505370
HHHHHHuang楼主2023/7/18 21:36
#include<bits/stdc++.h>
using namespace std;
struct x
{
	int x,y,z;
}g[500005];
int n,m,p,a[500005],f[500005][40],f1[500005][40],dep[500005],k[500005];
int sum,ans,father[500005],x2,y2;
vector<int>b[500005],c[500005];
long long find(long long x)
{
	if(father[x]!=x)father[x]=find(father[x]);
	return father[x];
}
void dfs(int u,int fa)
{
//	cout<<u<<" "<<fa<<" "<<f1[u][0]<<"\n";
	dep[u]=dep[fa]+1;
	f[u][0]=fa;
	for(int i=0;(1<<i)<=dep[u];i++)
		f[u][i+1]=f[f[u][i]][i],f1[u][i+1]=min(f1[f[u][i]][i],f1[u][i]);
	for(int i=0;i<b[u].size();i++)
	{
		int v=b[u][i];
		if(v==fa)continue;
		f1[v][0]=c[u][i];
		dfs(v,u);
	}
}
int LCA(int x,int y)
{
	if(dep[x]<dep[y])swap(x,y);
	//cout<<x<<" "<<y<<" ";
	int sum1=1e9;
	for(int i=35;i>=0;i--)
	{
		if(dep[f[x][i]]>=dep[y])
		{
			sum1=min(sum1,f1[x][i]);
			x=f[x][i];
		}
	}
	//cout<<x<<" "<<y<<"\n";
	if(x==y)return sum1;
	for(int i=35;i>=0;i--)
	{
		if(f[x][i]!=f[y][i]&&f[x][i]!=0&&f[y][i]!=0)
		{
			sum1=min(sum1,f1[x][i]);
			sum1=min(sum1,f1[y][i]);			
			x=f[x][i];
			y=f[y][i];

		}
	}
	sum1=min(sum1,f1[x][0]);
	sum1=min(sum1,f1[y][0]);
	return sum1;
}
int cmp(x a,x b)
{
	return a.z>b.z;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		father[i]=i;
	memset(f1,127,sizeof(f1));
	for(int i=0;i<m;i++)
		scanf("%d%d%d",&g[i].x,&g[i].y,&g[i].z);
	sort(g,g+m,cmp);
	for(int i=0;i<m;i++)
	{
		if(find(g[i].x)!=find(g[i].y))
		{
			father[find(g[i].x)]=find(g[i].y);
			b[g[i].x].push_back(g[i].y);
			b[g[i].y].push_back(g[i].x);
			c[g[i].x].push_back(g[i].z);
			c[g[i].y].push_back(g[i].z);
		}
	}
	dep[0]=-1;dfs(1,0);
	cin>>m;
	for(int i=0;i<m;i++)
	{
		cin>>x2>>y2;
		int l=LCA(x2,y2);
		if(l==1e9)cout<<-1<<"\n";
		else cout<<l<<"\n";
	}
	return 0;
}
2023/7/18 21:36
加载中...