codeforces D. Distance in Tree

题意:在一颗数中找距离为K的点对数 以后确定状态之后,最后看看有什么属性是不用确定的。。
#include<cstdio>
#include<cstring>
#include<iostream>
#define LL long long
#define LMT 50003
using namespace std;
LL dis[LMT][505];//SB,这里是500!!!!
int next[LMT];
int all,k,n;
LL ans;
struct line
{
    int u,v,next;
}e[2*LMT];
void insert(int u,int v)
{
    e[all].u=u;
    e[all].v=v;
    e[all].next=next[u];
    next[u]=all++;
    e[all].v=u;
    e[all].u=v;
    e[all].next=next[v];
    next[v]=all++;
}
void inidfs(int pre,int u)
{
    dis[u][0]=1;
    int i,v,x;
    for(x=next[u];x!=-1;x=e[x].next)
    if(e[x].v!=pre)
    {
        v=e[x].v;
        inidfs(u,v);
        for(i=0;i<k;i++)
           ans+=dis[v][i]*dis[u][k-i-1];
        for(i=0;i<k;i++)
            dis[u][i+1]+=dis[v][i];
    }
}
int main(void)
{
    int i;ans=0;
    scanf("%d%d",&n,&k);
    memset(next,-1,sizeof(next));
    for(i=1;i<n;i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        insert(u,v);
    }
    inidfs(-1,1);
    cout<<ans<<endl;
    return 0;
}

你可能感兴趣的:(codeforces D. Distance in Tree)