本题是树形dp,树的最大独立集问题。
自己涂色,那孩子一定不能涂***r>自己不涂色,那孩子无所谓,由于自己也在里面,所以要加一
dp[root][0]+=max(dp[to][0],dp[to][1]); dp[root][1]+=dp[to][0]; 循环外 dp[root][1]+=1;
注意坑点:第一天要在s市住宿,所以答案不是dp数组里的最大值,而是dp[s][1]
#include <bits/stdc++.h> using namespace std; vector <int> G[500500]; int dp[500500][2]; void dfs(int root,int pre) { for(int i=0;i<G[root].size();i++) { int to=G[root][i]; if(to==pre) continue; dfs(to,root); dp[root][0]+=max(dp[to][0],dp[to][1]); dp[root][1]+=dp[to][0]; } dp[root][1]+=1; } int main() { int n,s; scanf("%d%d",&n,&s); for(int i=1;i<n;i++) { int u,v; scanf("%d%d",&u,&v); G[u].push_back(v); G[v].push_back(u); } dfs(s,0); printf("%d\n",dp[s][1]); }