题意:给定一棵树,从s点开始,每次选择一个没有染色过的点居住,居住后所有相邻的点都会被染色,问最多住几个点?
solution:树形dp,这题和“没有上司的舞会”几乎完全一样, 表示i点住/不住的最大值,,只不过起点必选,所以答案只可能是 ,
Code:
#include <bits/stdc++.h> using namespace std; const int N = 1e6 + 5; int n, s, idx, h[N], dp[N][2]; struct Node { int to, next; } g[N]; void add(int x, int y) { g[idx].to = y, g[idx].next = h[x], h[x] = idx++; } void dfs(int u, int fa) { dp[u][1] = 1; for (int i = h[u]; ~i; i = g[i].next) { int v = g[i].to; if (v == fa) continue; dfs(v, u); dp[u][0] += max(dp[v][0], dp[v][1]); dp[u][1] += dp[v][0]; } } int main() { memset(h, -1, sizeof(h)); cin >> n >> s; for (int i = 1; i < n; i++) { int x, y; cin >> x >> y; add(x, y); add(y, x); } dfs(s, -1); cout << dp[s][1] << '\n'; return 0; }