1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| #include <bits/stdc++.h> using namespace std;
const int N = 300005, M = 22; int head[N], ecnt, n, m, k, dis[N], dep[N], s[N], t[N], L[N], fa[N][M], rnk[N], dfs-clock, len[N], d[N], fr[N]; struct E {int nxt, v, w;} e[N << 1]; void add-edge(int u, int v, int w) { e[++ecnt] = {head[u], v, w}; head[u] = ecnt; e[++ecnt] = {head[v], u, w}; head[v] = ecnt; }
void dfs(int u, int f) { fa[u][0] = f; rnk[++dfs-clock] = u; for (int i = 1; i < M; i++) { fa[u][i] = fa[fa[u][i - 1]][i - 1]; } for (int i = head[u]; i; i = e[i].nxt) { int v = e[i].v, w = e[i].w; if (v == f) continue; dis[v] = dis[u] + w; fr[v] = w; dep[v] = dep[u] + 1; dfs(v, u); } } int LCA(int u, int v) { if (dep[u] < dep[v]) swap(u, v); for (int i = M - 1; i + 1; i--) { if (dep[fa[u][i]] >= dep[v]) u = fa[u][i]; } if (u == v) return v; for (int i = M - 1; i + 1; i--) { if (fa[u][i] != fa[v][i]) u = fa[u][i], v = fa[v][i]; } return fa[u][0]; } bool check(int x) { memset(d, 0, sizeof d); int mx = 0, cnt = 0; for (int i = 1; i <= m; i++) { if (len[i] <= x) continue; cnt++; mx = max(len[i], mx); d[s[i]]++; d[t[i]]++; d[L[i]] -= 2; } for (int i = n; i; i--) { int now = rnk[i]; d[fa[now][0]] += d[now]; if (d[now] == cnt && mx - fr[now] <= x) return 1; } return 0; }
int main() { int l = 0, r = 0, ans = 0; scanf("%d %d", &n, &m); for (int i = 1; i < n; i++) { int u, v, w; scanf("%d %d %d", &u, &v, &w); add-edge(u, v, w); } dfs(1, 0); for (int i = 1; i <= m; i++) { scanf("%d %d", &s[i], &t[i]); L[i] = LCA(s[i], t[i]); len[i] = dis[s[i]] + dis[t[i]] - 2 * dis[L[i]]; r = max(len[i], r); } while (l <= r) { int mid = (l + r) >> 1; if (check(mid)) r = mid - 1, ans = mid; else l = mid + 1; } printf("%d\n", ans); return 0; }
|