【BZOJ】2060: [Usaco2010 Nov]Visiting Cows 拜访奶牛

时间:2023-03-09 17:00:17
【BZOJ】2060: [Usaco2010 Nov]Visiting Cows 拜访奶牛

【算法】树形DP

【题解】没有上司的舞会?233

f[x][0]=∑max(f[v][0],f[v][1])

f[x][1]=(∑f[v][0])+1

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=; struct edge{int v,from;}e[maxn*];
int first[maxn],n,f[maxn][],tot=; void insert(int u,int v){tot++;e[tot].v=v;e[tot].from=first[u];first[u]=tot;}
void dfs(int x,int fa){
f[x][]=;f[x][]=;
for(int i=first[x];i;i=e[i].from)if(e[i].v!=fa){
dfs(e[i].v,x);
f[x][]+=max(f[e[i].v][],f[e[i].v][]);
f[x][]+=f[e[i].v][];
}
}
int main(){
scanf("%d",&n);
int u,v;
for(int i=;i<n;i++){
scanf("%d%d",&u,&v);
insert(u,v);insert(v,u);
}
dfs(,);
printf("%d",max(f[][],f[][]));
return ;
}