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 80 81 82 83 84 85 86
| struct HPD_tree { int tree_size; bool is_hpd_init = false; std::vector<std::vector<std::pair<int, i64>>> adj; std::vector<int> Fa, size, hson, top, rank, dfn, depth; HPD_tree(int n = 0) { tree_size = n; adj.resize(tree_size + 1); } void add_edge(int u, int v, i64 w = 1) { adj[u].push_back({ v,w }); adj[v].push_back({ u,w }); } void HPD_init() { is_hpd_init = true; Fa.assign(tree_size + 1, 0); size.assign(tree_size + 1, 0); hson.assign(tree_size + 1, 0); top.assign(tree_size + 1, 0); rank.assign(tree_size + 1, 0); dfn.assign(tree_size + 1, 0); depth.assign(tree_size + 1, 0); std::function<void(int, int, int)> dfs1 = [&](int u, int p, int d)->void { hson[u] = 0; size[hson[u]] = 0; size[u] = 1; depth[u] = d; for (auto [v, w] : adj[u])if (v != p) { dfs1(v, u, d + 1); size[u] += size[v]; Fa[v] = u; if (size[v] > size[hson[u]]) { hson[u] = v; } } }; dfs1(1, 0, 0); int tot = 0; std::function<void(int, int, int)> dfs2 = [&](int u, int p, int t)->void { top[u] = t; dfn[u] = ++tot; rank[tot] = u; if (hson[u]) { dfs2(hson[u], u, t); for (auto [v, w] : adj[u])if (v != p && v != hson[u]) { dfs2(v, u, v); } } }; dfs2(1, 0, 1); } int lca(int u, int v) { if (!is_hpd_init)HPD_init(); while (top[u] != top[v]) { if (depth[top[u]] > depth[top[v]]) u = Fa[top[u]]; else v = Fa[top[v]]; } return depth[u] > depth[v] ? v : u; } i64 dist(int u, int v) { int w = lca(u, v); return depth[u] - depth[w] + depth[v] - depth[w] + 1; } a3 get_diam() { i64 cur; int pos; std::function<void(int, int, i64)> dfs = [&](int u, int p, i64 d) { if (d > cur) { cur = d; pos = u; } for (auto [v, dis] : adj[u])if (v != p) { dfs(v, u, d + dis); } }; cur = 0, pos = 1; dfs(pos, 0, cur); int u = pos; cur = 0; dfs(pos, 0, cur); int v = pos; return { u,v,cur }; } };
|