Description
Input
Output
Sample Input
11 6 1 2 1 3 1 4 1 5 2 6 2 7 2 8 4 9 4 10 4 11
Sample Output
2
Hint
#include<stdio.h>
#include<string.h>
#define inf 1000000
struct nn
{
int k,son[155];
}node[155];
int dp[155][155],vist[155],N,rootk[155];
int min(int a,int b)
{
return a>b?b:a;
}
void dfs(int p)
{
vist[p]=1; rootk[p]=1;
dp[p][1]=0;
for(int i=1;i<=node[p].k;i++)
{
int son=node[p].son[i];
if(vist[son])continue;
dfs(son); rootk[p]+=rootk[son];
for(int m=N;m>=1;m--)
{
dp[p][m]+=1;//与子点断开
for(int k=1;k<=rootk[son]&&k<m;k++)//更新与子树连接的情况
{
dp[p][m]=min(dp[p][m],dp[p][m-k]+dp[son][k]);
}
//printf("%d:(%d,%d) ",p,m,dp[p][m]);
}
for(int k=1;k<=rootk[son];k++) dp[son][k]+=1;//以son为根节点作一棵单独子树与父点点断开,所以需加1
}
}
int main()
{
int P,a,b,k,MIN;
while(scanf("%d%d",&N,&P)>0)
{
memset(dp,inf,sizeof(dp));
memset(vist,0,sizeof(vist));
for(int i=0;i<=N;i++)
node[i].k=0;
for(int i=1;i<N;i++)
{
scanf("%d%d",&a,&b);
node[a].k++; k=node[a].k; node[a].son[k]=b;
node[b].k++; k=node[b].k; node[b].son[k]=a;
}
dfs(1);
MIN=inf;
for(int i=1;i<=N;i++)
if(rootk[i]>=P)
MIN=min(MIN,dp[i][P]);
printf("%d\n",MIN);
}
}
poj1947Rebuilding Roads(树形DP,经典。。。。),布布扣,bubuko.com
poj1947Rebuilding Roads(树形DP,经典。。。。)
原文:http://blog.csdn.net/u010372095/article/details/21556297