Submission #48046

#TimeUsernameProblemLanguageResultExecution timeMemory
48046E869120Beads and wires (APIO14_beads)C++14
0 / 100
2 ms384 KiB
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int N, A[209], B[209], C[209], par[209], d[209][209]; vector<pair<int, int>>Z[209], X[209]; bool used[209];
int dp[209][4][2], maxn; vector<int>S;

void dfs(int pos, int pars) {
	used[pos] = true; par[pos] = pars;
	for (int i = 0; i < Z[pos].size(); i++) {
		if (used[Z[pos][i].first] == true) continue;
		X[pos].push_back(Z[pos][i]);
		dfs(Z[pos][i].first, pos);
	}
	S.push_back(pos);
}

int main() {
	cin >> N;
	for (int i = 1; i <= N - 1; i++) {
		cin >> A[i] >> B[i] >> C[i]; d[A[i]][B[i]] = C[i]; d[B[i]][A[i]] = C[i];
		Z[A[i]].push_back(make_pair(B[i], C[i]));
		Z[B[i]].push_back(make_pair(A[i], C[i]));
	}
	dfs(1, -1);
	for (int i = 0; i <= N; i++) { for (int j = 0; j <= 4; j++) { dp[i][j][0] = -(1 << 30); dp[i][j][1] = -(1 << 30); } }

	for (int i = 0; i < S.size(); i++) {
		int pos = S[i];

		// 次数 = 0 - 次数 = 1, 上を使う
		int s = 0;
		for (int j = 0; j < X[pos].size(); j++) {
			int maxn = -1;
			for (int k = 0; k <= 2; k++) maxn = max(maxn, dp[X[pos][j].first][k][0]);
			if (maxn == -1 || s == -(1 << 30)) s = -(1 << 30);
			else s += maxn;
		}
		dp[pos][0][1] = s;
		dp[pos][1][0] = s;
		
		// 次数 = 1, 上を使わない - 次数 = 2, 上を使う
		for (int a1 = 0; a1 < X[pos].size(); a1++) {
			int sum = 0;
			for (int j = 0; j < X[pos].size(); j++) {
				int maxn = -1, bit = 0; if (a1 == j) bit = 1;
				for (int k = 0; k <= 2; k++) maxn = max(maxn, dp[X[pos][j].first][k][bit]);
				if (maxn == -1 || sum == -(1 << 30)) sum = -(1 << 30);
				else sum += maxn;
			}
			dp[pos][1][1] = max(dp[pos][1][1], sum);
			if (pos != 1) dp[pos][2][0] = max(dp[pos][2][0], sum + d[par[pos]][pos] + d[X[pos][a1].first][pos]);
		}

		// 次数 = 2, 上を使わない
		for (int a1 = 0; a1 < X[pos].size(); a1++) {
			for (int a2 = 0; a2 < X[pos].size(); a2++) {
				if (a1 == a2) continue;

				int sum = 0;
				for (int j = 0; j < X[pos].size(); j++) {
					int maxn = -1, bit = 0; if (a1 == j || a2 == j) bit = 1;
					for (int k = 0; k <= 2; k++) maxn = max(maxn, dp[X[pos][j].first][k][bit]);
					if (maxn == -1 || sum == -(1 << 30)) sum = -(1 << 30);
					else sum += maxn;
				}
				dp[pos][2][1] = max(dp[pos][2][1], sum + d[X[pos][a1].first][pos] + d[X[pos][a2].first][pos]);
			}
		}
	}
	int ret = -(1 << 30);
	for (int i = 0; i <= 2; i++) ret = max(ret, dp[1][i][1]);
	cout << ret << endl;
	return 0;
}

Compilation message (stderr)

beads.cpp: In function 'void dfs(int, int)':
beads.cpp:11:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < Z[pos].size(); i++) {
                  ~~^~~~~~~~~~~~~~~
beads.cpp: In function 'int main()':
beads.cpp:29:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < S.size(); i++) {
                  ~~^~~~~~~~~~
beads.cpp:34:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int j = 0; j < X[pos].size(); j++) {
                   ~~^~~~~~~~~~~~~~~
beads.cpp:44:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int a1 = 0; a1 < X[pos].size(); a1++) {
                    ~~~^~~~~~~~~~~~~~~
beads.cpp:46:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for (int j = 0; j < X[pos].size(); j++) {
                    ~~^~~~~~~~~~~~~~~
beads.cpp:57:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int a1 = 0; a1 < X[pos].size(); a1++) {
                    ~~~^~~~~~~~~~~~~~~
beads.cpp:58:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for (int a2 = 0; a2 < X[pos].size(); a2++) {
                     ~~~^~~~~~~~~~~~~~~
beads.cpp:62:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int j = 0; j < X[pos].size(); j++) {
                     ~~^~~~~~~~~~~~~~~
beads.cpp:27:76: warning: iteration 4 invokes undefined behavior [-Waggressive-loop-optimizations]
  for (int i = 0; i <= N; i++) { for (int j = 0; j <= 4; j++) { dp[i][j][0] = -(1 << 30); dp[i][j][1] = -(1 << 30); } }
                                                                ~~~~~~~~~~~~^~~~~~~~~~~~
beads.cpp:27:51: note: within this loop
  for (int i = 0; i <= N; i++) { for (int j = 0; j <= 4; j++) { dp[i][j][0] = -(1 << 30); dp[i][j][1] = -(1 << 30); } }
                                                 ~~^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...