Submission #1211290

#TimeUsernameProblemLanguageResultExecution timeMemory
1211290k1r1t0Beads and wires (APIO14_beads)C++20
100 / 100
119 ms29108 KiB
#include <bits/stdc++.h>

using namespace std;
#define int long long

const int N = 210000;
const int INF = (int)(1e18);

int dp[N][2], n, a[N], b[N], c[N], ans;
vector<array<int, 2>> g[N];

void build(int v, int p = -1, int pw = 0) {
	for (auto [u, w] : g[v]) if (u != p) {
		build(u, v, w);
		dp[v][0] += dp[u][1];
	}
	dp[v][1] = -INF;
	for (auto [u, w] : g[v]) if (u != p)
		dp[v][1] = max(dp[v][1], dp[v][0] - dp[u][1] + dp[u][0] + w);
	dp[v][1] = max(dp[v][1] + pw, dp[v][0]);
}

void solve(int v, int p = -1) {
	int dp0 = 0;
	for (auto [u, w] : g[v])
		dp0 += dp[u][1];
	int m = g[v].size();
	vector<int> dp1(m, -INF);
	int val = -INF;
	for (int i = 0; i < m; i++) {
		dp1[i] = max(dp1[i], val);
		auto [u, w] = g[v][i];
		val = max(val, dp0 - dp[u][1] + dp[u][0] + w);
	}
	val = -INF;
	for (int i = m - 1; i >= 0; i--) {
		dp1[i] = max(dp1[i], val);
		auto [u, w] = g[v][i];
		val = max(val, dp0 - dp[u][1] + dp[u][0] + w);
	}
	for (int i = 0; i < m; i++) {
		auto [u, w] = g[v][i];
		dp[v][0] = dp0 - dp[u][1];
		dp[v][1] = max(dp1[i] - dp[u][1] + w, dp0 - dp[u][1]);
		if (u != p) solve(u, v);
	}
	ans = max(ans, dp0);
}

int32_t main() {
	ios::sync_with_stdio(0); cin.tie(0);
	cin >> n;
	for (int i = 1; i <= n - 1; i++) {
		cin >> a[i] >> b[i] >> c[i];
		g[a[i]].push_back({b[i], c[i]});
		g[b[i]].push_back({a[i], c[i]});
	}
	build(1);
	solve(1);
	cout << ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...