25分求助
查看原帖
25分求助
428358
Grisses楼主2022/4/8 20:39
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,cnt,ans,lca[300005],w[300005],h[300005],sum[300005],len[300005],M[300005],Log[300005],s[300005],t[300005],U[300005],f[300005][20];
struct edge{
	int v,nxt,w;
}e[600005];
void adde(int u,int v,int w){
	e[++cnt].nxt=h[u];
	h[u]=cnt;
	e[cnt].v=v;
	e[cnt].w=w;
}
void dfs(int x,int fa){
	len[x]=len[fa]+1;
	f[x][0]=fa;
	for(int i=1;i<=Log[len[x]];i++)f[x][i]=f[f[x][i-1]][i-1];
	for(int i=h[x];i;i=e[i].nxt){
		if(e[i].v==fa)continue;
		M[e[i].v]=M[x]+e[i].w;
		U[e[i].v]=((i&1)?i/2+1:i/2);
		dfs(e[i].v,x);
	}
}
int LCA(int u,int v){
	if(len[u]<len[v])swap(u,v);
	while(len[u]!=len[v])u=f[u][Log[len[u]-len[v]]];
	if(u==v)return u;
	for(int i=Log[len[u]];i>=0;i--){
		if(f[u][i]!=f[v][i]){
			u=f[u][i];
			v=f[v][i];
		}
	}
	return f[u][0];
}
void dfs1(int x,int fa){
	for(int i=h[x];i;i=e[i].nxt){
		if(e[i].v==fa)continue;
		dfs1(e[i].v,x);
		sum[U[x]]+=sum[U[e[i].v]];
	}
}
bool ch(int x){
	memset(sum,0,sizeof(sum));
	int maxn=0,tot=0;
	for(int i=1;i<=m;i++){
		if(w[i]>x){
			maxn=max(maxn,w[i]);
			sum[U[s[i]]]++;
			sum[U[t[i]]]++;
			sum[U[lca[i]]]-=2;
			tot++;
		}
	}
	if(tot==0)return 1;
	dfs1(1,0);
	for(int i=2;i<=n;i++){
		if(sum[U[i]]==tot){
			if(maxn-e[U[i]*2].w<=x)return 1;
		}
	}
	return 0;
}
signed main()
{
	scanf("%lld%lld",&n,&m);
	for(int i=1,u,v,w;i<n;i++){
		scanf("%lld%lld%lld",&u,&v,&w);
		adde(u,v,w);
		adde(v,u,w);
	}
	dfs(1,0);
	for(int i=1,u,v;i<=m;i++){
		scanf("%lld%lld",&u,&v);
		s[i]=u,t[i]=v;
		lca[i]=LCA(u,v);
		w[i]=M[u]+M[v]-2*M[lca[i]];
	}
	int l=0,r=300000005,mid;
	while(l<r){
		mid=l+r>>1;
		if(ch(mid))r=mid-1,ans=mid;
		else l=mid+1;
	}
	printf("%lld",ans);
	return 0;
}
2022/4/8 20:39
加载中...