题意:在一颗数中找距离为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;
}