Submission #1250716

#TimeUsernameProblemLanguageResultExecution timeMemory
1250716kunzaZa183Training (IOI07_training)C++20
100 / 100
19 ms14404 KiB
#include <bits/stdc++.h>
using namespace std;
int main() {
  cin.tie(0)->sync_with_stdio(0);
  int n, m;
  cin >> n >> m;
  vector<vector<int>> adj(n);
  vector<array<int, 3>> vai3;
  int tot = 0;
  for (int i = 0; i < m; i++) {
    int a, b, c;
    cin >> a >> b >> c;
    a--, b--;
    if (c == 0) {
      adj[a].push_back(b), adj[b].push_back(a);
    } else {
      tot += c;
      vai3.push_back({a, b, c});
    }
  }

  vector<int> dep(n);
  vector<int> parvi(n);
  vector<int> which(n);
  int curd = 0;
  function<void(int, int, int)> fvii = [&](int cur, int par, int in) {
    dep[cur] = curd;
    which[cur] = in;
    parvi[cur] = par;
    for (int i = 0; i < adj[cur].size(); i++)
      if (adj[cur][i] == par) {
        swap(adj[cur][i], adj[cur].back());
      }
    if (par != -1)
      adj[cur].pop_back();

    for (int i = 0; i < adj[cur].size(); i++) {
      curd++;
      fvii(adj[cur][i], cur, i);
      curd--;
    }
  };
  fvii(0, -1, -1);

  vector<array<int, 3>> vai32;
  for (auto [a, b, c] : vai3) {
    if (dep[a] % 2 == dep[b] % 2)
      vai32.push_back({a, b, c});
  }

  vai3.swap(vai32);

  vector<vector<int>> lca(n);
  vector<vector<pair<int, int>>> vvpii;
  for (int i = 0; i < vai3.size(); i++) {
    auto [a, b, c] = vai3[i];
    vvpii.emplace_back();
    if (dep[a] > dep[b])
      swap(a, b);

    while (dep[a] < dep[b]) {
      if (parvi[b] == a) {
        vvpii.back().emplace_back(parvi[b], 1 << which[b]);
      } else
        vvpii.back().emplace_back(parvi[b], ((1 << adj[parvi[b]].size()) - 1) ^
                                                (1 << which[b]));
      b = parvi[b];
    }

    while (a != b) {
      if (parvi[a] == parvi[b]) {
        vvpii.back().emplace_back(parvi[a], (1 << which[b]) ^ (1 << which[a]));
      } else {
        vvpii.back().emplace_back(parvi[a], ((1 << adj[parvi[a]].size()) - 1) ^
                                                (1 << which[a]));
        vvpii.back().emplace_back(parvi[b], ((1 << adj[parvi[b]].size()) - 1) ^
                                                (1 << which[b]));
      }
      a = parvi[a], b = parvi[b];
    }

    lca[a].push_back(i);
  }

  vector<vector<int>> dp(n);
  function<void(int)> dfs2 = [&](int cur) {
    for (auto a : adj[cur]) {
      dfs2(a);
    }

    dp[cur].resize(1 << adj[cur].size());
    vector<int> lcaval(lca[cur].size());

    for (int i = 0; i < lca[cur].size(); i++) {
      int in = lca[cur][i];

      lcaval[i] = vai3[in][2];
      if (vai3[in][0] != vvpii[in].back().first)
        lcaval[i] += dp[vai3[in][0]].back();
      if (vai3[in][1] != vvpii[in].back().first)
        lcaval[i] += dp[vai3[in][1]].back();

      for (int j = 0; j + 1 < vvpii[in].size(); j++) {
        lcaval[i] += dp[vvpii[in][j].first][vvpii[in][j].second];
      }
    }

    for (int i = 0; i < dp[cur].size(); i++) {
      for (int j = 0; j < lca[cur].size(); j++) {
        int in = lca[cur][j];
        if ((i & vvpii[in].back().second) == vvpii[in].back().second)
          dp[cur][i] =
              max(dp[cur][i], dp[cur][i ^ vvpii[in].back().second] + lcaval[j]);
      }

      int val = 0;
      for (int j = 0; j < adj[cur].size(); j++) {
        if ((1 << j) & i)
          val += dp[adj[cur][j]].back();
      }
      dp[cur][i] = max(dp[cur][i], val);
    }
  };
  dfs2(0);

  cout << tot - dp[0].back() << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...