RT,代码中 if (s[u]==num) 一次都没有成立过。
代码
#include <iostream>
#include <cstring>
using namespace std;
const int N = 300010,M = 2 * N,MAX_LOG = 18;
int n,m;
int h[N],e[M],ne[M],tmpw[M],idx;
int f[N][MAX_LOG];
int dis[N];
int maxlen;
int dep[N];
int s[N],w[N];
int num,ans;
void add_edge (int a,int b,int c) {
e[idx] = b;
tmpw[idx] = c;
ne[idx] = h[a];
h[a] = idx++;
}
struct tran {
int a,b,LCA,len;
}t[N];
void DFS1 (int u,int fa) {
for (int i = h[u];~i;i = ne[i]) {
int j = e[i];
if (j == fa) continue;
dep[j] = dep[u] + 1;
dis[j] = dis[u] + tmpw[i];
w[j] = tmpw[i];
DFS1 (j,u);
f[j][0] = u;
for (int k = 1;k < MAX_LOG;k++) f[j][k] = f[f[j][k - 1]][k - 1];
}
}
void DFS2 (int u,int fa) {
for (int i = h[u];~i;i = ne[i]) {
int j = e[i];
if (j == fa) continue;
DFS2 (j,u);
s[u] += s[j];
}
if (s[u] == num) ans = max (ans,w[u]);
}
int get_LCA (int a,int b) {
if (dep[a] < dep[b]) swap (a,b);
for (int i = MAX_LOG - 1;i >= 0;i--) {
if (dep[f[a][i]] >= dep[b]) a = f[a][i];
}
if (a == b) return a;
for (int i = MAX_LOG - 1;i >= 0;i--) {
if (f[a][i] != f[b][i]) a = f[a][i],b = f[b][i];
}
return f[a][0];
}
bool check (int x) {
memset (s,0,sizeof (s));
num = ans = 0;
for (int i = 1;i <= m;i++) {
if (t[i].len > x) {
s[t[i].a]++,s[t[i].b]++,s[t[i].LCA] -= 2;
num++;
}
}
DFS2 (1,-1);
return maxlen - ans <= x;
}
int main () {
memset (h,-1,sizeof (h));
cin >> n >> m;
for (int i = 1;i <= n - 1;i++) {
int a,b,c;
cin >> a >> b >> c;
add_edge (a,b,c),add_edge (b,a,c);
}
dep[1] = 1;
DFS1 (1,-1);
int maxlen = 0;
for (int i = 1;i <= m;i++) {
cin >> t[i].a >> t[i].b;
t[i].LCA = get_LCA (t[i].a,t[i].b);
t[i].len = dis[t[i].a] + dis[t[i].b] - 2 * dis[t[i].LCA];
maxlen = max (maxlen,t[i].len);
}
int l = 0,r = maxlen;
while (l < r) {
int mid = l + r >> 1;
if (check (mid)) r = mid;
else l = mid + 1;
}
cout << l << endl;
return 0;
}