首页 > 代码库 > bzoj2060[Usaco2010 Nov]Visiting Cows 拜访奶牛*
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 拜访奶牛*
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。