bzoj2060[Usaco2010 Nov]Visiting Cows 拜访奶牛*

Posted YuanZiming

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj2060[Usaco2010 Nov]Visiting Cows 拜访奶牛*相关的知识,希望对你有一定的参考价值。

bzoj2060[Usaco2010 Nov]Visiting Cows 拜访奶牛

题意:

给棵树,要求如果取了某个节点就不能取与它相邻的节点,问最多可取几个节点。树的大小≤50000。

题解:

树形dp。令f[i][0]不取i节点,f[i][1]为取i节点,则方程为f[i][0]=sum(max(f[j][0],f[j][1]+1)),f[i][1]=sum(f[j][0]),j为i的子节点。最后答案为max(f[1][0],f[1][1]+1)。注意不要漏了那个“+1”。

代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #define inc(i,j,k) for(int i=j;i<=k;i++)
 5 #define maxn 50010
 6 using namespace std;
 7 
 8 inline int read(){
 9     char ch=getchar(); int f=1,x=0;
10     while(ch<0||ch>9){if(ch==-)f=-1; ch=getchar();}
11     while(ch>=0&&ch<=9)x=x*10+ch-0,ch=getchar();
12     return f*x;
13 }
14 struct e{int t,n;}es[maxn*2]; int g[maxn],ess,n,dp[maxn][2];
15 void pe(int f,int t){es[++ess]=(e){t,g[f]}; g[f]=ess; es[++ess]=(e){f,g[t]}; g[t]=ess;}
16 void dfs(int x,int fa){
17     dp[x][0]=dp[x][1]=0;
18     for(int i=g[x];i;i=es[i].n)if(es[i].t!=fa){
19         dfs(es[i].t,x); dp[x][0]+=max(dp[es[i].t][1]+1,dp[es[i].t][0]); dp[x][1]+=dp[es[i].t][0];
20     }
21 }
22 int main(){
23     n=read(); inc(i,1,n-1){int a=read(),b=read(); pe(a,b);} dfs(1,0);
24     printf("%d",max(dp[1][0],dp[1][1]+1)); return 0;
25 }

 

20160907

以上是关于bzoj2060[Usaco2010 Nov]Visiting Cows 拜访奶牛*的主要内容,如果未能解决你的问题,请参考以下文章

Bzoj 2058: [Usaco2010 Nov]Cow Photographs 题解

BZOJ_2058_[Usaco2010 Nov]Cow Photographs_逆序对

[bzoj2058][Usaco2010 Nov]Cow Photographs_树状数组_动态规划

bzoj2058: [Usaco2010 Nov]Cow Photographs(逆序对)

bzoj 3312: [Usaco2013 Nov]No Change

Bzoj 1229: [USACO2008 Nov]toy 玩具