結果

問題 No.912 赤黒木
ユーザー ei1333333ei1333333
提出日時 2019-09-08 01:14:43
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 461 ms / 3,000 ms
コード長 1,122 bytes
コンパイル時間 2,041 ms
コンパイル使用メモリ 196,476 KB
最終ジャッジ日時 2025-01-07 17:25:19
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 30
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>

using namespace std;

const int inf = (1 << 29) - 1;

int N;
vector< int > g[200000];
bool deg[200000], sum[200000];
int dp[200000][3];

void predfs(int idx, int par) {
  sum[idx] = deg[idx];
  for(auto &to : g[idx]) {
    if(to == par) continue;
    predfs(to, idx);
    sum[idx] ^= sum[to];
  }
}

void dfs(int idx, int par) {
  vector< int > subdp{0, 0, 0};
  for(auto &to : g[idx]) {
    if(to == par) continue;
    dfs(to, idx);
    vector< int > nxtdp{inf, inf, inf};
    for(int i = 0; i < 3; i++) {
      for(int j = 0; i + j < 3; j++) {
        nxtdp[i + j] = min(nxtdp[i + j], subdp[i] + dp[to][j] + (j + sum[to]) % 2);
      }
    }
    subdp.swap(nxtdp);
  }
  for(int i = 0; i < 3; i++) {
    dp[idx][i] = subdp[i];
  }
}

int main() {
  cin >> N;
  for(int i = 1; i < N; i++) {
    int a, b;
    cin >> a >> b;
    --a, --b;
    g[a].emplace_back(b);
    g[b].emplace_back(a);
  }
  for(int i = 1; i < N; i++) {
    int a, b;
    cin >> a >> b;
    --a, --b;
    deg[a] ^= 1;
    deg[b] ^= 1;
  }
  predfs(0, -1);
  dfs(0, -1);
  cout << min(dp[0][0], dp[0][2]) + (N - 1) << endl;
}
0