思路
对于每个选择的点,其周围的点都是不能选的,我们从根结点出发深搜+DP,就能求出答案了。
可以参考 没有上司的舞会 ,这道题就是退化版。
代码
#include<bits/stdc++.h> using namespace std; const int maxn=500005; struct E{ int to,next; }edge[maxn<<1]; int n,s,cnt=0,dp[maxn][2]; int x,y,head[maxn],du[maxn]; void addedge(int from,int to){ edge[++cnt].next=head[from]; edge[cnt].to=to; head[from]=cnt; } void dfs(int node,int pre){ for(int i=head[node];i;i=edge[i].next){ int to=edge[i].to; if(to!=pre){ dfs(to,node); dp[node][0]+=max(dp[to][1],dp[to][0]); dp[node][1]+=dp[to][0]; } } } int main(){ cin>>n>>s; for(int i=1;i<=n;i++){ du[i]=0; dp[i][1]=1; dp[i][0]=0; } for(int i=1;i<n;i++){ cin>>x>>y; addedge(x,y); addedge(y,x); du[x]++;du[y]++; } dfs(s,0); cout<<dp[s][1]; return 0; }