結果
問題 | No.2677 Minmax Independent Set |
ユーザー |
|
提出日時 | 2024-03-13 21:03:22 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 254 ms / 2,000 ms |
コード長 | 1,435 bytes |
コンパイル時間 | 3,125 ms |
コンパイル使用メモリ | 253,948 KB |
実行使用メモリ | 46,164 KB |
最終ジャッジ日時 | 2024-09-30 00:15:44 |
合計ジャッジ時間 | 12,525 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 61 |
ソースコード
#include <bits/stdc++.h>using namespace std;int N;vector<vector<int>> adj;vector<int> order;vector<vector<int>> children;void dfs(int x, int p = -1) {order.push_back(x);for (auto &&c : adj[x]) {if (c == p) continue;dfs(c, x);children[x].push_back(c);}}int main() {cin >> N;adj.resize(N);children.resize(N);for (int i = 0; i < N - 1; i++) {int u, v;cin >> u >> v;u--;v--;adj[u].push_back(v);adj[v].push_back(u);}dfs(0);vector<pair<int, int>> dp(N, {0, 1});reverse(order.begin(), order.end());for (auto &&i : order) {for (auto &&j : children[i]) {dp[i] = {dp[i].first + max(dp[j].first, dp[j].second),dp[i].second + dp[j].first,};}}reverse(order.begin(), order.end());for (auto &&i : order) {for (auto &&j : children[i]) {pair<int, int> dp_par = {dp[i].first - max(dp[j].first, dp[j].second),dp[i].second - dp[j].first,};dp[j] = {dp[j].first + max(dp_par.first, dp_par.second),dp[j].second + dp_par.first,};}}int ans = numeric_limits<int>::max();for (auto &&[x, y] : dp) {ans = min(ans, y);}cout << ans << endl;}