输出文件只包含一个整数,表示小 P 的物流公司完成阶段性工作所需要的最短时间。
输出文件只包含一个整数,表示小 P 的物流公司完成阶段性工作所需要的最短时间。
#include <bits/stdc++.h> using namespace std; inline int read() { int x = 0, f = 1; char ch = getchar(); while (ch < ‘0‘ || ch > ‘9‘) { if (ch == ‘-‘) f = -1; ch = getchar(); } while (ch >= ‘0‘ && ch <= ‘9‘) { x = x * 10 + ch - 48; ch = getchar(); } return x * f; } const int N = 3e5 + 10; struct E { int ne, v, f; } e[N << 1], q[N << 1]; struct length { int u, v, len, lca; } ans[N]; int head[N], headq[N], cnt, n, m, maxlen, s[N], num, ret, fa[N], dis[N], a[N]; bool vis[N]; inline void add(int u, int v, int f) { e[++cnt].v = v; e[cnt].f = f; e[cnt].ne = head[u]; head[u] = cnt; } inline void addq(int u, int v) { q[++cnt].v = v; q[cnt].ne = headq[u]; headq[u] = cnt; } int getfa(int x) { return x == fa[x] ? fa[x] : fa[x] = getfa(fa[x]); } void tarjan(int u) { fa[u] = u; vis[u] = 1; for (int i = head[u]; i; i = e[i].ne) { int v = e[i].v; if (vis[v]) continue; dis[v] = dis[u] + e[i].f; tarjan(v); a[v] = e[i].f; fa[v] = u; } for (int i = headq[u]; i; i = q[i].ne) { int v = q[i].v; if (vis[v]) { ans[(i + 1) / 2].lca = getfa(v); ans[(i + 1) / 2].len = dis[u] + dis[v] - 2 * dis[ans[(i + 1) / 2].lca]; maxlen = max(maxlen, ans[(i + 1) / 2].len); } } } void dfs(int u, int pre) { for (int i = head[u]; i; i = e[i].ne) { int v = e[i].v; if (v == pre) continue; dfs(v, u); s[u] += s[v]; } if (s[u] == num && a[u] > ret) ret = a[u]; } bool check(int mid) { memset(s, 0, sizeof(s)); num = ret = 0; for (int i = 1; i <= m; i++) { if (ans[i].len > mid) { num++; s[ans[i].u]++; s[ans[i].v]++; s[ans[i].lca] -= 2; } } dfs(1, 0); return maxlen - ret <= mid; } int main() { n = read(), m = read(); for (int i = 0; i < n - 1; i++) { int u = read(), v = read(), f = read(); add(u, v, f); add(v, u, f); } for (int i = 1; i <= n; i++) fa[i] = i; cnt = 0; for (int i = 1; i <= m; i++) { int u = read(), v = read(); ans[i].u = u; ans[i].v = v; addq(u, v); addq(v, u); } tarjan(1); int l = 0, r = maxlen; while (l + 1 < r) { int mid = (l + r) / 2; if (check(mid)) r = mid; else l = mid; } printf("%d\n", r); return 0; }
原文:https://www.cnblogs.com/Mrzdtz220/p/11027838.html