15分求助
查看原帖
15分求助
181437
cyfff楼主2021/4/30 16:11
#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int M=300005;
int n,m,hd[M],to[M*2],vl[M*2],nxt[M*2],cnt,x[M],y[M];
int lc[M],lg[M],fa[M][26],dep[M],sm,cf[M],ds[M],dis[M];
void add(int u,int v,int w)
{nxt[++cnt]=hd[u];hd[u]=cnt;to[cnt]=v;vl[cnt]=w;}
int lca(int k,int l){
	if(dep[k]<dep[l])swap(k,l);
	while(dep[k]>dep[l])k=fa[k][lg[dep[k]-dep[l]]-1];
	if(k==l)return k;
	for(ri j=lg[dep[k]]-1;j>=0;--j)if(fa[k][j]!=fa[l][j])
	{k=fa[k][j];l=fa[l][j];}
	return fa[k][0];
}
void dfs(int k,int l){
	fa[k][0]=l;dep[k]=dep[l]+1;
	for(ri j=1;j<=lg[dep[k]];++j)
	fa[k][j]=fa[fa[k][j-1]][j-1];
	for(ri j=hd[k];j;j=nxt[j])
	if(l!=to[j])dis[to[j]]=dis[k]+vl[j],dfs(to[j],k);
}
void chfe(int k,int l){
	for(ri i=hd[k];i;i=nxt[i])
	if(to[i]!=l){dfs(to[i],k);cf[k]+=cf[to[i]];}
}
bool ck(int k){
	ri cnt=0,s=0;memset(cf,0,sizeof(cf));
	for(ri i=1;i<=m;++i)if(ds[i]>k){
		cf[x[i]]++;cf[y[i]]++;cf[lc[i]]-=2;
		s=max(s,ds[i]-k);++cnt;
	}
	if(!cnt)return true;chfe(1,0);
	for(ri i=2;i<=n;++i)if(cf[i]==cnt&&dis[i]-dis[fa[i][0]]>=s)return true;
	return false;
}
int main(){
	scanf("%d%d",&n,&m);
	for(ri i=1,u,v,w;i<n;++i){
		scanf("%d%d%d",&u,&v,&w);
		add(u,v,w);add(v,u,w);sm+=w;
	}
	for(ri i=1;i<=n;++i)lg[i]=lg[i-1]+(1<<lg[i-1]==i);dfs(1,0);
	for(ri i=1;i<=m;++i){
		scanf("%d%d",&x[i],&y[i]);
		lc[i]=lca(x[i],y[i]);
		ds[i]=dis[x[i]]+dis[y[i]]-2*dis[lc[i]];
	}
	ri l=0,r=sm,mid;
	while(l<r){
		mid=(l+r)>>1;
		if(ck(mid))r=mid;
		else l=mid+1;
	}
	printf("%d",l);
	return 0;
}
2021/4/30 16:11
加载中...