제출 #1138131

#제출 시각아이디문제언어결과실행 시간메모리
1138131Pekiban구슬과 끈 (APIO14_beads)C++20
0 / 100
2 ms4932 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;
#define pb push_back

const int N = 2e5 + 5;
ll dp[N][2][2];
vector<array<int, 2>> g[N];
void dfs(int s, int e = -1) {
    dp[s][0][0] = 0, dp[s][1][0] = dp[s][1][1] = dp[s][0][1] = -1e12;
    for (auto [u, w] : g[s]) {
        if (u == e) continue;
        dfs(u, s);
        dp[s][0][0] += max({dp[u][0][0], dp[u][0][1], dp[u][1][0] + w});
    }
    for (auto [u, w1] : g[s]) {
        if (u == e) continue;
        ll bs = dp[u][0][0] + w1;
        for (auto [v, w2] : g[s]) {
            if (v == e || v == u)   continue;
            bs += max({dp[v][0][0], dp[v][0][1], dp[v][1][0] + w2});
        }
        dp[s][1][0] = max(dp[s][1][0], bs);
    }
    // cout << s << ' ' << dp[s][1][0] << '\n';
    for (auto [u, w1] : g[s]) {
        if (u == e) continue;
        for (auto [v, w2] : g[s]) {
            if (v == e || v == u)   continue;
            ll bs = max(dp[u][0][0], dp[u][0][1]) + max(dp[v][0][0], dp[v][0][1]) + w1 + w2;
            for (auto [t, w3] : g[s]) {
                if (t == v || t == u || t == e) continue;
                bs += max({dp[t][0][0], dp[t][0][1], dp[t][1][0] + w3});
            }
            dp[s][0][1] = max(dp[s][0][1], bs);
        }
        ll bs = dp[u][1][1] + w1;
        for (auto [v, w2] : g[s]) {
            if (v == e || v == u)   continue;
            bs += max({dp[v][0][0], dp[v][0][1], dp[v][1][0] + w2});
        }
        dp[s][0][1] = max(dp[s][0][1], bs);
    }
    for (auto [u, w1] : g[s]) {
        if (u == e) continue;
        ll bs = dp[u][0][1] + w1;
        for (auto [v, w2] : g[s]) {
            if (v == e || u == v) continue;
            bs += max({dp[v][0][0], dp[v][0][1], dp[v][1][0] + w2});
        }
        dp[u][1][1] = max(dp[u][1][1], bs);
    }
}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n;
    cin >> n;
    for (int i = 1; i < n; ++i) {
        int u, v, w;
        cin >> u >> v >> w;
        g[u].pb({v, w}); 
        g[v].pb({u, w});
    }
    dfs(1);
    cout << max(dp[1][0][0], dp[1][0][1]) << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...