思路
对于每个选择的点,其周围的点都是不能选的,我们从根结点出发深搜+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;
} 
京公网安备 11010502036488号