[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;
}

浙公网安备 33010602011771号