10分,1,2过了,求救
查看原帖
10分,1,2过了,求救
404202
acacac123楼主2022/8/8 15:57
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll fa[10010],cnt,deep[10010],dis[100010][25],jump[10010][25];
struct six{
	ll T;
	ll N;
	ll H;
	ll W;
}tree[50010];
struct sex{
	ll t;
	ll h;
	ll w;
}tr[50010];
bool cmp(sex f,sex s)
{
	return f.w>s.w;
}
ll found(ll x)
{
	if(fa[x]==x)
	{
		return x;
	}
	fa[x]=found(fa[x]);
	return fa[x];
}
void build(ll x,ll y,ll z)
{
	tree[++cnt].N=tree[x].H;
	tree[cnt].T=y;
	tree[cnt].W=z;
	tree[x].H=cnt;
}
void DFS(ll x)
{
	for(ll i=tree[x].H;i!=-1;i=tree[i].N)
	{
		ll t=tree[i].T;
		if(deep[t]!=0)
		{
			continue;
		}
		deep[t]=deep[x]+1;
		dis[t][0]=min(dis[t][0],tree[i].W);
		jump[t][0]=x;
		DFS(t);
	}
}
ll LCA(ll x,ll y)
{
	if(found(x)!=found(y))
	{
		return -1;
	}
	if(deep[x]<deep[y])
	{
		swap(x,y);
	}
	ll ans=456789456789;
	for(ll i=20;i>=0;i--)
	{
		if(deep[jump[x][i]]>deep[y])
		{
			ans=min(ans,dis[x][i]);
			x=jump[x][i];
		}
	}
	if(x==y)
	{
		return ans;
	}
	for(ll i=20;i>=0;i--)
	{
		if(jump[y][i]!=jump[x][i])
		{
			ans=min(ans,dis[y][i]);
			ans=min(ans,dis[x][i]);
			x=jump[x][i];
			y=jump[y][i];
		}
	}
	return min(ans,min(dis[x][0],dis[y][0]));
}
int main()
{
//	freopen("P1967_3.in","r",stdin);
//	freopen("answer.out","w",stdout);
	ll n,m;
	cin>>n>>m;
	for(ll i=1;i<=n;i++)
	{
		fa[i]=i;
	}
	for(ll i=1;i<=m;i++)
	{
		ll x,y,z;
		cin>>x>>y>>z;
		tr[i].h=x;
		tr[i].t=y;
		tr[i].w=z;
	}
	for(ll i=1;i<=50010;i++)
	{
		tree[i].H=-1;
	}
	sort(tr+1,tr+1+m,cmp);
	for(ll i=1;i<=m;i++)
	{
		ll x=found(tr[i].h);
		ll y=found(tr[i].t);
		if(x!=y)
		{
			fa[x]=y;
			build(tr[i].h,tr[i].t,tr[i].w);
			build(tr[i].t,tr[i].h,tr[i].w);
		}
	}
	memset(dis,0x3f3f3f3f,sizeof(dis));
	for(ll i=1;i<=n;i++)
	{
		if(deep[i]==0)
		{
			deep[i]=1;
			DFS(i);
			jump[i][0]=i;
			dis[i][0]=0x3f3f3f3f;
		}
	}
	for(ll i=1;i<=20;i++)
	{
		for(ll j=1;j<=n;j++)
		{
			jump[j][i]=jump[jump[j][i-1]][i-1];
			dis[j][i]=min(dis[j][i-1],dis[jump[j][i-1]][i-1]);
		}
	}
	ll q;
	cin>>q;
	while(q--)
	{
		ll x,y;
		cin>>x>>y;
		cout<<LCA(x,y)<<endl;
	}
}

谢谢

2022/8/8 15:57
加载中...