20pts 求调,玄关
查看原帖
20pts 求调,玄关
700558
williamwei楼主2024/9/14 19:47
#include <iostream>
#include <vector>
using namespace std;
typedef long long ll;
const int maxn = 1e6 + 10;
int n, top, tot, deg[maxn], stk[maxn], id[maxn];
ll ans, f[maxn][2], g[maxn], res[maxn];
vector<pair<int, int> > e[maxn];
void dfs(int u, int pa, int cur) {
    f[u][0] = f[u][1] = 0;
    for (auto [v, w] : e[u]) if (id[v] == -1 && v != pa) {
        dfs(v, u, cur);
        if (f[v][0] + w > f[u][0]) f[u][1] = f[u][0], f[u][0] = f[v][0] + w;
        else if (f[v][0] + w > f[u][1]) f[u][1] = f[v][0] + w;
    }
    res[cur] = max(res[cur], f[u][0] + f[u][1] - 1);
}
void dfs2(int u) {
    id[u] = tot;
    for (auto [v, w] : e[u]) if (!id[v]) dfs2(v);
}
void dfs3(int u, int pa, int head, int cnt, ll cur, bool st) {
    if (f[u][0]) ++cnt;
    if (cnt > 2 - (!st) - (!f[u][0])) return;
    cur += f[u][0]; res[id[u]] = max(res[id[u]], cur);
    for (auto [v, w] : e[u]) if (~id[v] && v != pa && v != head) dfs3(v, u, head, cnt, cur + w, st);
}
int main() {
    ios::sync_with_stdio(false);
    cin >> n;
    for (int u = 1; u <= n; u++) {
        int v, w; cin >> v >> w;
        e[u].emplace_back(v, w); e[v].emplace_back(u, w);
        ++deg[u]; ++deg[v];
    }
    for (int u = 1; u <= n; u++) if (deg[u] == 1) stk[++top] = u;
    while (top) {
        int u = stk[top--]; id[u] = -1;
        for (auto [v, w] : e[u]) if (--deg[v] == 1) stk[++top] = v;
    }
    for (int u = 1; u <= n; u++) if (~id[u]) {
        if (!id[u]) ++tot, dfs2(u);
        dfs(u, 0, tot);
    }
    for (int u = 1; u <= n; u++) if (~id[u]) dfs3(u, 0, u, 0, 0, f[u][0]);
    for (int u = 1; u <= tot; u++) ans += res[u];
    cout << ans << '\n';
    return 0;
}
2024/9/14 19:47
加载中...