[USACO12FEB]附近的牛Nearby Cows
f[i][j]=f[s][j-1]-f[i][j-2]*(son[i]-1);
#include<bits/stdc++.h> using namespace std; struct node{ int to,br; }bian[210001];//和二楼存树方式相同 int son[100001],len; int f[100001][21],sons[100001];//状态,孩子数 int a,b,n,k; void INIT()//建树 { bian[++len].to=b; bian[len].br=son[a]; son[a]=len; bian[++len].to=a; bian[len].br=son[b]; son[b]=len; sons[a]++; sons[b]++; } int main() { int i,j,s; scanf("%d%d",&n,&k); for(i=1;i<n;i++) { scanf("%d%d",&a,&b); INIT(); } for(i=1;i<=n;i++)scanf("%d",&f[i][0]);//走0步相当于此节点的奶牛数 for(j=1;j<=k;j++)//DP开始 for(i=1;i<=n;i++){//枚举节点 for(s=son[i];s;s=bian[s].br)//枚举连通节点 f[i][j]+=f[bian[s].to][j-1]; if(j>1)f[i][j]-=(sons[i]-1)*f[i][j-2]; else f[i][1]+=f[i][0];//注意!这里一定要加判断,否则会越界+遗漏。 } for(i=1;i<=n;i++) printf("%d\n",f[i][k]);//输出就好了 return 0; }