제출 #261192

#제출 시각아이디문제언어결과실행 시간메모리
261192atoiz구슬과 끈 (APIO14_beads)C++14
100 / 100
322 ms27632 KiB
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

const int MAXN = 200007;
const int64_t INF = 1e13;
int64_t dp[MAXN][2][2];
int N;
vector<pair<int, int>> G[MAXN];

void solve(int u, int p, int64_t c)
{
	dp[u][0][0] = dp[u][0][1] = -INF;
	dp[u][1][0] = dp[u][1][1] = -INF;

	int64_t a[2][2] = {{0, -INF}, {-INF, -INF}}; // --
	int64_t b[3] = {0, -INF, -INF}; // -0
	int64_t f[2] = {0, -INF};
	for (auto e : G[u]) {
		int v = e.first, w = e.second;
		if (v == p) continue;
		solve(v, u, w);

		a[1][1] = max(a[1][1] + dp[v][0][0], max(a[1][0] + dp[v][1][1], a[0][1] + dp[v][1][0]) + w);
		a[0][1] = max(a[0][1] + dp[v][0][0], a[0][0] + dp[v][1][1] + w);
		a[1][0] = max(a[1][0] + dp[v][0][0], a[0][0] + dp[v][1][0] + w);
		a[0][0] += dp[v][0][0];

		b[1] = max(b[1] + dp[v][0][0], b[0] + dp[v][1][0] + w);
		b[2] = max(b[2] + dp[v][0][0], b[0] + dp[v][1][1] + w);
		b[0] += dp[v][0][0];

		f[1] = max(f[0] + dp[v][0][1], f[1] + dp[v][0][0]);
		f[0] += dp[v][0][0];
	}

	dp[u][1][1] = max(dp[u][1][1], a[1][1]);
	dp[u][0][0] = max(dp[u][0][0], b[1] + c);
	dp[u][0][1] = max(dp[u][0][1], b[2] + c);

	dp[u][1][0] = max(dp[u][1][0], b[0]);
	dp[u][1][1] = max(dp[u][1][1], b[0]);
	dp[u][1][1] = max(dp[u][1][1], f[1]);

	dp[u][0][0] = max(dp[u][0][0], dp[u][1][0]);
	dp[u][0][1] = max(dp[u][0][1], dp[u][1][1]);

	// cout << u << ' ' << 0 << ' ' << 0 << ": " << dp[u][0][0] << endl;
	// cout << u << ' ' << 0 << ' ' << 1 << ": " << dp[u][0][1] << endl;
	// cout << u << ' ' << 1 << ' ' << 0 << ": " << dp[u][1][0] << endl;
	// cout << u << ' ' << 1 << ' ' << 1 << ": " << dp[u][1][1] << endl;
}

int main()
{
	ios_base::sync_with_stdio(0); cin.tie(0);
	cin >> N;
	for (int i = 0; i < N - 1; ++i) {
		int u, v, w;
		cin >> u >> v >> w;
		G[u].emplace_back(v, w);
		G[v].emplace_back(u, w);
	}
	solve(1, 0, -INF);
	cout << dp[1][0][1] << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...