10pts代码求助
查看原帖
10pts代码求助
1087520
sutiancheng楼主2024/8/31 19:19

蒟蒻代码:

#include <bits/stdc++.h>
using namespace std;
int n,m,q,t,fa[100005],d[100005];
bool vis[100005];
struct node{int l,r,d;}in[500005];
struct line{int f,d;}p[100005][20];
vector<line>a[100005];
//Kruskal+倍增 d数组为深度 p数组为倍增 vis数组为是否被搜索到 
void dfs(int x,int f,int di)
{
	vis[x]=1;
	d[x]=d[f]+1;
	p[x][0]=line{f,di};
	for(int i=1;(i<<i)<=d[x];i++)
	{
		p[x][i].f=p[p[x][i-1].f][i-1].f;
		p[x][i].d=min(p[x][i-1].d,p[p[x][i-1].f][i-1].d);
	}
	for(int i=0;i<a[x].size();i++)if(a[x][i].f!=f)
		dfs(a[x][i].f,x,a[x][i].d);
}
int lca(int l,int r)
{
	int mi=0x7f7f7f7f;
	if(d[l]<d[r])swap(l,r);
	for(int i=t;i>=0;i--)if(d[p[l][i].f]>=d[r])
		mi=min(mi,p[l][i].d),l=p[l][i].f;
	if(l==r)return mi;
	for(int i=t;i>=0;i--)if(p[l][i].f!=p[r][i].f)
		mi=min(mi,min(p[l][i].d,p[r][i].d)),l=p[l][i].f,r=p[r][i].f;
	return min(mi,min(p[l][0].d,p[r][0].d));
}
int find(int x)
{
	if(fa[x]==x)return x;
	return fa[x]=find(fa[x]);
}
bool cmp(node x,node y){return x.d>y.d;}
int main()
{
	cin>>n>>m;
	t=log2(n)+1;
	for(int i=1;i<=n;i++)fa[i]=i;
	for(int i=1;i<=m;i++)cin>>in[i].l>>in[i].r>>in[i].d;
	sort(in+1,in+m+1,cmp);
	for(int i=1,l,r;i<=m;i++)
	{
		l=find(in[i].l),r=find(in[i].r);
		if(l!=r)
		{
			fa[l]=r;
			a[l].push_back(line{r,in[i].d});
			a[r].push_back(line{l,in[i].d});
		}
	}
	for(int i=1;i<=n;i++)if(!vis[i])dfs(i,0,100001);
	cin>>q;
	for(int i=1,l,r;i<=q;i++)
	{
		cin>>l>>r;
		if(find(l)!=find(r))cout<<-1<<'\n';
		else cout<<lca(l,r)<<'\n';
	}
	return 0;
}

大佬们帮帮吧QwQ 调了一下午

2024/8/31 19:19
加载中...