#include <bits/stdc++.h>
#define MAXN 300000
using namespace std;
struct edge
{
int to,nxt,w;
}e[MAXN*2];
int head[MAXN],cnt;
struct sta
{
int u,v,lca,dis;
}road[MAXN];
int sum,n,m,k;
int num[MAXN],min[MAXN],tmp[MAXN],vis[MAXN],dis[MAXN],dep[MAXN];
int fa[MAXN][25],dp[MAXN][25];
void addline(int u,int v,int w)
{
e[++cnt].to=v;
e[cnt].nxt=head[u];
e[cnt].w=w;
head[u]=cnt;
}
void dfs(int x,int p,int depth)
{
k++;
num[k]=x;
dep[x]=depth;
vis[x]=1;
for (int i=1;i<=23;i++)
{
fa[x][i]=fa[fa[x][i-1]][i-1];
}
for (int i=head[x];i;i=e[i].nxt)
{
int ed=e[i].to;
if (!vis[ed])
{
fa[ed][0]=x;
dis[ed]=dis[x]+e[i].w;
dfs(ed,x,depth+1);
}
}
}
int lca(int u,int v)
{
if (dep[u]<dep[v])
{
swap(u,v);
}
int t=dep[u]-dep[v];
for (int i=0;i<25;i++)
{
if (t&(1<<i))
{
u=fa[u][i];
}
}
if (u==v)
{
return u;
}
for (int i=24;i>=0;i--)
{
if (fa[u][i]!=fa[v][i])
{
u=fa[u][i];
v=fa[v][i];
}
}
return fa[u][0];
}
bool check(int mid)
{
int cnt1=0;
int ans=0;
memset(tmp,0,sizeof(tmp));
for (int i=1;i<=m;i++)
{
if (road[i].dis>mid)
{
tmp[road[i].u]++;
tmp[road[i].v]++;
tmp[road[i].lca]-=2;
ans=max(ans,road[i].dis-mid);
cnt1++;
}
}
if (cnt1==0)
{
return true;
}
for (int i=n;i>=1;i--)
{
tmp[fa[num[i]][0]]+=tmp[num[i]];
}
for (int i=2;i<=n;i++)
{
if (tmp[i]==cnt1&&dis[i]-dis[fa[i][0]]>=ans)
{
return true;
}
}
return false;
}
int main()
{
scanf("%d %d",&n,&m);
for (int i=1;i<=n-1;i++)
{
int u,v,w;
scanf("%d %d %d",&u,&v,&w);
addline(u,v,w);
addline(v,u,w);
sum+=w;
}
dis[1]=0;
dfs(1,0,1);
for (int i=1;i<=m;i++)
{
scanf("%d %d",&road[i].u,&road[i].v);
road[i].lca=lca(road[i].u,road[i].v);
road[i].dis=dis[road[i].u]+dis[road[i].v]-2*dis[road[i].lca];
}
int l=0,r=sum;
int mid;
while (l<r)
{
mid=(l+r)>>1;
if (check(mid))
{
r=mid;
}
else
{
l=mid+1;
}
}
printf("%d\n",l);
return 0;
}
Subtask 2 的 #13 WA 掉了,
其余的全部 AC。