結果
問題 | No.763 Noelちゃんと木遊び |
ユーザー |
|
提出日時 | 2025-04-21 22:52:04 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 117 ms / 2,000 ms |
コード長 | 984 bytes |
コンパイル時間 | 2,431 ms |
コンパイル使用メモリ | 203,804 KB |
実行使用メモリ | 24,320 KB |
最終ジャッジ日時 | 2025-04-21 22:52:10 |
合計ジャッジ時間 | 6,250 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 22 |
ソースコード
#include <bits/stdc++.h> using namespace std; using graph = vector<vector<int>>; graph g; vector<vector<int>> dp; //dp[-][0] = break //dp[-][1] = not break void dfs(int v,int p=-1){ if(g[v].size() == 1){ dp[v][0] = 0; dp[v][1] = 1; } int dp_cum_br=0; int dp_cum_nbr=1; for(int nex:g[v]){ if(nex == p) continue; dfs(nex,v); dp_cum_br += max(dp[nex][0],dp[nex][1]); dp_cum_nbr += max(dp[nex][0],dp[nex][1]-1); } dp[v][0] = dp_cum_br; dp[v][1] = dp_cum_nbr; } int main(){ int n; cin >> n; g.resize(n,vector<int>()); vector<int> u(n-1),v(n-1); for(int i=0; n-1>i; ++i){ cin >> u[i] >> v[i]; u[i]--; v[i]--; g[u[i]].push_back(v[i]); g[v[i]].push_back(u[i]); } //dp[n][2] := 頂点nを根とする部分木であって頂点nを削除する/しない時の最大値 dp.resize(n,vector<int>(2,-1)); dfs(0); cout << max(dp[0][0],dp[0][1]) << endl; }