题目给了512MB的空间....用dp[k][i]代表以k为起点...往下面走(走直的不打岔)i步能有多少方案....在更新dp[k][i]过程中同时统计答案..

Program:

#include<iostream>
#include<queue>
#include<stack>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<cmath>
#define ll long long
#define oo 1000000007
#define MAXN 50005
using namespace std;
struct node
{
int x,y,next;
}line[MAXN*2];
int n,K,dp[MAXN][502],_next[MAXN];
bool used[MAXN];
ll ans;
void addline(int x,int y,int m)
{
line[m].next=_next[x],_next[x]=m;
line[m].x=x,line[m].y=y;
return;
}
void dfs(int x)
{
int i,j,k;
k=_next[x];
dp[x][0]=1;
while (k)
{
if (!used[line[k].y])
{
used[line[k].y]=true;
dfs(line[k].y);
for (i=K;i>=1;i--) ans+=dp[x][K-i]*dp[line[k].y][i-1];
for (i=K;i>=1;i--) dp[x][i]+=dp[line[k].y][i-1];
}
k=line[k].next;
}
return;
}
int main()
{
int i,j;
while (~scanf("%d%d",&n,&K))
{
memset(_next,0,sizeof(_next));
for (i=1;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
addline(x,y,i*2-1);
addline(y,x,i*2);
}
memset(used,false,sizeof(used));
memset(dp,0,sizeof(dp));
used[1]=true;
ans=0;
dfs(1);
printf("%I64d\n",ans);
}
return 0;
}

最新文章

  1. otter双主同步安装与配置
  2. 制作Win7(x86)PE ISO文件
  3. 黑马程序员——有关protocol代理模式的举例说明
  4. SRM 449 div1 (practice)
  5. Error Curves(2010成都现场赛题)
  6. Linux的VI/VIM
  7. CountDownLatch 使用说明
  8. Linux学习历程——Centos 7 passwd命令
  9. H5_0005:JS判断域名和时间有效期的方法
  10. trinitycore 魔兽服务器源码分析(一) 网络
  11. k-vim安装及The ycmd server SHUT DOWN (restart with &#39;:YcmRestartServer&#39;)这种错误的解决方法
  12. Flutter - 退出App
  13. Spark partitionBy
  14. BEM思想之彻底弄清BEM语法
  15. js数组之迭代器方法
  16. Bash Shell 里的各种括号
  17. trust an HTTPS connection
  18. c#运用this.invoke() 在多线程时对UI进行修改
  19. 【BZOJ1266】[AHOI2006]上学路线route Floyd+最小割
  20. FIR IIR数字滤波器特点简介

热门文章

  1. python-摩斯码转换
  2. 非阻塞IO
  3. CSS选择器、优先级和匹配原理
  4. golang win32编程的一个dll坑
  5. nodejs开发微信1——微信access-token和tickets的数据模型
  6. Swift初体验(三)
  7. 执行startx后Ubuntupassword正确进不去的问题
  8. JSP简单练习-获取表单数据
  9. Java单态模式
  10. hdu1285+hdu2467(拓扑排序)