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