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

  

posted @ 2019-07-25 14:06  [jackeylove]  阅读(103)  评论(0编辑  收藏  举报