Submission #104519

#TimeUsernameProblemLanguageResultExecution timeMemory
104519E869120Beads and wires (APIO14_beads)C++14
13 / 100
7 ms5120 KiB
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#pragma warning (disable: 4996)

int N, A[100009], B[100009], C[100009], F[100009], maxn = 0;

void solve(int G, int H, int I, int dep) {
	maxn = max(maxn, dep);
	vector<pair<int, int>>X[16];
	for (int i = 0; i < N - 1; i++) {
		if ((G / (1 << i)) % 2 == 0) continue;
		X[A[i + 1] - 1].push_back(make_pair(B[i + 1] - 1, i));
		X[B[i + 1] - 1].push_back(make_pair(A[i + 1] - 1, i));
	}

	for (int i = 0; i < N; i++) {
		if ((I / (1 << i)) % 2 == 0) continue;
		for (int j = 0; j < X[i].size(); j++) {
			for (int k = j + 1; k < X[i].size(); k++) {
				if ((H / (1 << X[i][k].first)) % 2 == 0 && (H / (1 << X[i][j].first)) % 2 == 0) continue;
				int v1 = X[i][j].second, v2 = X[i][k].second;
				solve(G - (1 << v1) - (1 << v2), H & F[i], I & F[i] & F[X[i][j].first] & F[X[i][k].first], dep + C[v1 + 1] + C[v2 + 1]);
			}
		}
	}
}

int solve_Jury() {
	maxn = 0;
	for (int i = 0; i < N; i++) F[i] = (1 << N) - 1 - (1 << i);
	solve((1 << (N - 1)) - 1, (1 << N) - 1, (1 << N) - 1, 0);
	return maxn;
}

vector<pair<int, int>>X[100009], Y[100009]; int par[100009], w[100009], dp[100009][8];
bool used[100009];

void init() {
	for (int i = 0; i < 19; i++) {
		X[i].clear(); Y[i].clear();
		par[i] = 0; w[i] = 0; used[i] = false;
		for (int j = 0; j < 8; j++) dp[i][j] = 0;
	}
}

void dfs1(int pos) {
	used[pos] = true;
	for (int i = 0; i < X[pos].size(); i++) {
		if (used[X[pos][i].first] == true) continue;
		par[X[pos][i].first] = pos;
		w[X[pos][i].first] = X[pos][i].second;
		Y[pos].push_back(X[pos][i]);
		dfs1(X[pos][i].first);
	}
}

void dfs2(int pos) {
	for (int i = 0; i < Y[pos].size(); i++) dfs2(Y[pos][i].first);

	// pos を中心に結ばない場合
	for (int i = 0; i < Y[pos].size(); i++) {
		int max1 = 0; for (int j = 0; j < 4; j++) max1 = max(max1, dp[Y[pos][i].first][j]); dp[pos][0] += max1;
		int max2 = 0; for (int j = 0; j < 8; j++) max2 = max(max2, dp[Y[pos][i].first][j]); dp[pos][4] += max2;
	}

	// pos を中心に結ぶ場合
	for (int i = 0; i < X[pos].size(); i++) {
		for (int j = i + 1; j < X[pos].size(); j++) {
			// ---------------------- 0 の場合 --------------------------
			if (X[pos][i].first == par[pos] || X[pos][j].first == par[pos]) {
				int sum1 = 0, sum2 = 0;
				for (int k = 0; k < Y[pos].size(); k++) {
					int V1 = 0;
					if (X[pos][i] == Y[pos][k]) V1 = 0;
					else if (X[pos][j] == Y[pos][k]) V1 = 1;
					else V1 = 2;

					int V2 = 0;
					if (X[pos][j] == Y[pos][k]) V2 = 0;
					else if (X[pos][i] == Y[pos][k]) V2 = 1;
					else V2 = 2;

					int m1 = 0; for (int l = 0; l <= V1; l++) m1 = max(m1, dp[Y[pos][k].first][l]); sum1 += m1;
					int m2 = 0; for (int l = 0; l <= V2; l++) m2 = max(m2, dp[Y[pos][k].first][l]); sum2 += m2;
				}

				int v1 = 1; if (X[pos][i].first == par[pos]) v1 = 3; if (X[pos][j].first == par[pos]) v1 = 2;
				dp[pos][v1] = max(dp[pos][v1], sum1 + X[pos][i].second + X[pos][j].second);

				int v2 = 1; if (X[pos][j].first == par[pos]) v2 = 3; if (X[pos][i].first == par[pos]) v2 = 2;
				dp[pos][v2] = max(dp[pos][v2], sum2 + X[pos][i].second + X[pos][j].second);
			}
			
			// ---------------------- 4 の場合 --------------------------
			if (true) {
				int sum1 = 0, sum2 = 0;
				for (int k = 0; k < Y[pos].size(); k++) {
					int V1 = 0;
					if (X[pos][i] == Y[pos][k]) V1 = 0;
					else if (X[pos][j] == Y[pos][k]) V1 = 1;
					else V1 = 2;

					int V2 = 0;
					if (X[pos][j] == Y[pos][k]) V2 = 0;
					else if (X[pos][i] == Y[pos][k]) V2 = 1;
					else V2 = 2;

					int m1 = 0; for (int l = 0; l <= V1; l++) { m1 = max(m1, dp[Y[pos][k].first][l]); if (X[pos][i].first == par[pos] || X[pos][j].first == par[pos]) m1 = max(m1, dp[Y[pos][k].first][l + 4]); } sum1 += m1;
					int m2 = 0; for (int l = 0; l <= V2; l++) { m2 = max(m2, dp[Y[pos][k].first][l]); if (X[pos][i].first == par[pos] || X[pos][j].first == par[pos]) m2 = max(m2, dp[Y[pos][k].first][l + 4]); } sum2 += m2;
				}

				int v1 = 1; if (X[pos][i].first == par[pos]) v1 = 3; if (X[pos][j].first == par[pos]) v1 = 2;
				dp[pos][v1] = max(dp[pos][v1], sum1 + X[pos][i].second + X[pos][j].second);

				int v2 = 1; if (X[pos][j].first == par[pos]) v2 = 3; if (X[pos][i].first == par[pos]) v2 = 2;
				dp[pos][v2] = max(dp[pos][v2], sum2 + X[pos][i].second + X[pos][j].second);
			}
		}
	}
}

int solve_Output() {
	for (int i = 1; i <= N - 1; i++) {
		X[A[i]].push_back(make_pair(B[i], C[i]));
		X[B[i]].push_back(make_pair(A[i], C[i]));
	}
	dfs1(1);
	dfs2(1);
	return max({ dp[1][0], dp[1][1], dp[1][2], dp[1][3], dp[1][4], dp[1][5], dp[1][6], dp[1][7] });
}

void random_generate() {
	init();
	N = 16;
	for (int i = 1; i <= N - 1; i++) {
		A[i] = rand() % i + 1; B[i] = i + 1; C[i] = rand() % 10000 + 1;
	}
}

int main() {
	cin >> N;
	for (int i = 1; i <= N - 1; i++) cin >> A[i] >> B[i] >> C[i];
	cout << solve_Output() << endl;
	/*for (int i = 1; i <= 1000000; i++) {
		random_generate();
		
		int J1 = solve_Jury();
		int J2 = solve_Output();

		if (J1 != J2) {
			cout << "Wrong Answer on Test #" << i << endl;
			cout << "Jury = " << J1 << ", Output = " << J2 << endl;
			cout << endl;
			cout << N << endl;
			for (int j = 1; j <= N - 1; j++) cout << A[j] << " " << B[j] << " " << C[j] << endl;
			cout << endl;
		}
	}*/
	return 0;
}

Compilation message (stderr)

beads.cpp:5:0: warning: ignoring #pragma warning  [-Wunknown-pragmas]
 #pragma warning (disable: 4996)
 
beads.cpp: In function 'void solve(int, int, int, int)':
beads.cpp:20:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int j = 0; j < X[i].size(); j++) {
                   ~~^~~~~~~~~~~~~
beads.cpp:21:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for (int k = j + 1; k < X[i].size(); k++) {
                        ~~^~~~~~~~~~~~~
beads.cpp: In function 'void dfs1(int)':
beads.cpp:50:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < X[pos].size(); i++) {
                  ~~^~~~~~~~~~~~~~~
beads.cpp: In function 'void dfs2(int)':
beads.cpp:60:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < Y[pos].size(); i++) dfs2(Y[pos][i].first);
                  ~~^~~~~~~~~~~~~~~
beads.cpp:63:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < Y[pos].size(); i++) {
                  ~~^~~~~~~~~~~~~~~
beads.cpp:69:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < X[pos].size(); i++) {
                  ~~^~~~~~~~~~~~~~~
beads.cpp:70:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int j = i + 1; j < X[pos].size(); j++) {
                       ~~^~~~~~~~~~~~~~~
beads.cpp:74:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int k = 0; k < Y[pos].size(); k++) {
                     ~~^~~~~~~~~~~~~~~
beads.cpp:99:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int k = 0; k < Y[pos].size(); k++) {
                     ~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...