题意:给定一棵树,从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;
}
京公网安备 11010502036488号