Submission #104516

#TimeUsernameProblemLanguageResultExecution timeMemory
104516E869120Beads and wires (APIO14_beads)C++14
0 / 100
6 ms5120 KiB
#include <iostream> #include <vector> #include <algorithm> using namespace std; #pragma warning (disable: 4996) vector<pair<int, int>>X[100009], Y[100009]; int par[100009], w[100009]; bool used[100009]; 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); } } int dp[100009][4]; 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++) { dp[pos][0] += max({ dp[Y[pos][i].first][0], dp[Y[pos][i].first][1], dp[Y[pos][i].first][2], dp[Y[pos][i].first][3] }); } // pos を中心に結ぶ場合 for (int i = 0; i < X[pos].size(); i++) { for (int j = i + 1; j < X[pos].size(); j++) { 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; } // sum1 を使う場合 int v1 = 1; if (X[pos][j].first == par[pos]) v1 = 3; if (X[pos][i].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][i].first == par[pos]) v2 = 3; if (X[pos][j].first == par[pos]) v2 = 2; dp[pos][v2] = max(dp[pos][v2], sum2 + X[pos][i].second + X[pos][j].second); } } } int N, A[100009], B[100009], C[100009]; int main() { scanf("%d", &N); for (int i = 1; i <= N - 1; i++) { scanf("%d%d%d", &A[i], &B[i], &C[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); cout << max(dp[1][0], dp[1][1]) << 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 dfs1(int)':
beads.cpp:12: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:24: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:27:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < Y[pos].size(); i++) {
                  ~~^~~~~~~~~~~~~~~
beads.cpp:32:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < X[pos].size(); i++) {
                  ~~^~~~~~~~~~~~~~~
beads.cpp:33:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int j = i + 1; j < X[pos].size(); j++) {
                       ~~^~~~~~~~~~~~~~~
beads.cpp:35:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for (int k = 0; k < Y[pos].size(); k++) {
                    ~~^~~~~~~~~~~~~~~
beads.cpp: In function 'int main()':
beads.cpp:63:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &N);
  ~~~~~^~~~~~~~~~
beads.cpp:65:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d%d", &A[i], &B[i], &C[i]);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...