Skip to Content

Beads and Wires

Implementación

#include <bits/stdc++.h> typedef long long ll; using namespace std; int n, a, b; ll w, pw[200001], dp[200001][2][2]; vector<pair<int, ll>> graph[200001]; void dfs(int node, int par) { if (graph[node].size() == 1 && par != -1) return; ll tot = 0, best_mid = INT_MIN, best_unuse_mid = INT_MIN, best_unuse_mid2 = INT_MIN, best_unuse_nomid = INT_MIN, best_unuse_nomid2 = INT_MIN; int best_unuse_mid_child, best_unuse_mid_child2, best_unuse_nomid_child, best_unuse_nomid_child2; for (int i = 0; i < graph[node].size(); i++) { if (graph[node][i].first != par) { int child = graph[node][i].first; ll edge = graph[node][i].second; pw[child] = edge; dfs(child, node); ll normsc = max(dp[child][0][0], dp[child][1][0]); tot += normsc; ll midsc = max(dp[child][0][1], dp[child][1][1]) - normsc; if (midsc > best_mid) best_mid = midsc; ll unuse_midsc = dp[child][0][1] + edge - normsc; if (unuse_midsc > best_unuse_mid) { best_unuse_mid2 = best_unuse_mid; best_unuse_mid_child2 = best_unuse_mid_child; best_unuse_mid = unuse_midsc; best_unuse_mid_child = child; } else if (unuse_midsc > best_unuse_mid2) { best_unuse_mid2 = unuse_midsc; best_unuse_mid_child2 = child; } ll unuse_nomidsc = dp[child][0][0] + edge - normsc; if (unuse_nomidsc > best_unuse_nomid) { best_unuse_nomid2 = best_unuse_nomid; best_unuse_nomid_child2 = best_unuse_nomid_child; best_unuse_nomid = unuse_nomidsc; best_unuse_nomid_child = child; } else if (unuse_nomidsc > best_unuse_nomid2) { best_unuse_nomid2 = unuse_nomidsc; best_unuse_nomid_child2 = child; } } } dp[node][0][0] = tot; dp[node][0][1] = tot + max(0LL, best_mid); dp[node][0][1] = max(dp[node][0][1], tot + best_unuse_nomid + best_unuse_nomid2); if (best_unuse_mid_child != best_unuse_nomid_child) { dp[node][0][1] = max(dp[node][0][1], tot + best_unuse_nomid + best_unuse_mid); } else { dp[node][0][1] = max(dp[node][0][1], tot + best_unuse_nomid2 + best_unuse_mid); dp[node][0][1] = max(dp[node][0][1], tot + best_unuse_nomid + best_unuse_mid2); } dp[node][1][0] = tot + pw[node] + best_unuse_nomid; dp[node][1][1] = tot + pw[node] + best_unuse_mid; } int main() { cin >> n; for (int i = 0; i < n - 1; i++) { cin >> a >> b >> w; graph[a].push_back({b, w}); graph[b].push_back({a, w}); } dfs(1, -1); cout << max(dp[1][0][1], dp[1][0][0]) << '\n'; return 0; }