1. 程式人生 > >CodeForces 161D Distance in Tree【樹形DP】

CodeForces 161D Distance in Tree【樹形DP】

表示 ring sin 數量 can sizeof ans cst def

<題目鏈接>

題目大意:
一顆無向無環樹,有n個頂點,求其中距離為k的點對數是多少,(u,v)與(v,u)為同一點對。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 #define N int(5e4+10)
 7 int n,k,ans,cnt;
 8 int dp[N][510],head[N];
 9 struct Edge{
10     int to,nxt;
11 }edge[N<<1
]; 12 void init(){ 13 cnt=0;ans=0; 14 memset(head,-1,sizeof(head)); 15 memset(dp,0,sizeof(dp)); 16 } 17 void addedge(int u,int v){ 18 edge[cnt].to=v,edge[cnt].nxt=head[u]; 19 head[u]=cnt++; 20 } 21 void dfs(int u,int fa){ 22 dp[u][0]=1; //dp[i][j]表示以u為根的子樹中,距u的距離為j的點的數量
23 for(int i=head[u];~i;i=edge[i].nxt){ 24 int v=edge[i].to; 25 if(v==fa)continue; 26 dfs(v,u); 27 for(int j=0;j<k;j++)ans+=dp[u][j]*dp[v][k-j-1]; 28 for(int j=1;j<=k;j++)dp[u][j]+=dp[v][j-1]; 29 } 30 } 31 int main(){ 32 while
(~scanf("%d%d",&n,&k)){ 33 init(); 34 for(int i=1;i<n;i++){ 35 int u,v;scanf("%d%d",&u,&v); 36 addedge(u,v);addedge(v,u); 37 } 38 dfs(1,-1); 39 printf("%d\n",ans); 40 } 41 }

2019-02-07

CodeForces 161D Distance in Tree【樹形DP】