#include<bits/stdc++.h>
using namespace std;
int v[600010];
int nxt[600010];
int head[300010];
int tot = 0;
int val[600010];
int n,m;
struct node{
int s;
int t;
int dis;
int lca;
}way[300010];
inline void add(int x,int y,int z)
{
v[++tot] = y;
val[tot] = z;
nxt[tot] = head[x];
head[x] = tot;
return;
}
int dep[300010];
int fa[300010][21];
int fa_len[300010][21];
inline void dfs(int x,int f,int deep)
{
fa[x][0] = f;
dep[x] = deep;
for(int i = head[x];i;i = nxt[i])
{
if(v[i] == f) continue;
fa_len[v[i]][0] = val[i];
dfs(v[i],x,deep + 1);
}
return;
}
inline int LCA(int x,int y,int &num)
{
if(dep[x] < dep[y]) swap(x,y);
if(x == y) return x;
for(int log = 20;log >= 0;--log)
{
if(dep[fa[x][log]] > dep[y])
{
num += fa_len[x][log];
x = fa[x][log];
}
}
if(dep[x] > dep[y])
{
num += fa_len[x][0];
x = fa[x][0];
}
if(x == y) return x;
for(int log = 20;log >= 0;--log)
{
if(fa[x][log] != fa[y][log])
{
num += fa_len[x][log];
num += fa_len[y][log];
x = fa[x][log];
y = fa[y][log];
}
}
num += fa_len[x][0];
num += fa_len[y][0];
return fa[x][0];
}
inline bool cmp(node x,node y){return x.dis > y.dis;}
inline int check(int num,int s,int t,int lca)
{
int road = 0;
if(dep[num] > max(dep[s],dep[t])) return 0;
if(dep[num] <= dep[lca]) return 0;
if(LCA(s,num,road) == num || LCA(t,num,road) == num) return 1;
return 0;
}
int main()
{
// freopen("tree.in","r",stdin);
// freopen("tree.out","w",stdout);
ios::sync_with_stdio(0);
cin >> n >> m;
for(int i = 1,x,y,z;i < n;++i)
{
cin >> x >> y >> z;
add(x,y,z);
add(y,x,z);
}
dfs(1,1,1);
for(int log = 1;log <= 20;++log)
{
for(int i = 1;i <= n;++i)
{
fa[i][log] = fa[fa[i][log - 1]][log - 1];
fa_len[i][log] = fa_len[fa[i][log - 1]][log - 1] + fa_len[i][log - 1];
}
}
for(int i = 1,x,y;i <= m;++i)
{
cin >> way[i].s >> way[i].t;
way[i].lca = LCA(way[i].s,way[i].t,way[i].dis);
}
sort(way + 1,way + 1 + n,cmp);
// for(int i = 1;i <= m;++i) cout << way[i].lca << " " << way[i].dis << endl;
int minn = 1e9;
int max_s = way[1].s;
for(max_s = way[1].s;max_s != way[1].lca;max_s = fa[max_s][0])//删边
{
int maxn = 0;
for(int i = 1;i <= m;++i)//统计答案
{
if(way[i].dis < maxn) break;
if(check(max_s,way[i].s,way[i].t,way[i].lca))
{
maxn = max(maxn,way[i].dis - fa_len[max_s][0]);
}
else
{
maxn = max(maxn,way[i].dis);
}
if(maxn > minn) break;
}
minn = min(minn,maxn);
}
// cout << minn << endl;
for(max_s = way[1].t;max_s != way[1].lca;max_s = fa[max_s][0])//删边
{
int maxn = 0;
for(int i = 1;i <= m;++i)//统计答案
{
if(way[i].dis < maxn) break;
if(check(max_s,way[i].s,way[i].t,way[i].lca))
{
maxn = max(maxn,way[i].dis - fa_len[max_s][0]);
}
else
{
maxn = max(maxn,way[i].dis);
}
if(maxn > minn) break;
// cout << maxn << endl;
}
minn = min(minn,maxn);
}
if(minn == 1000000000) minn = 0;
cout << minn;
return 0;
}
想交篇题解qwq
可以自己测一下试试qwq