hdu 1947 Rebuilding Roads(树形DP)

原创 2016年08月30日 22:49:28

Description

The cows have reconstructed Farmer John's farm, with its N barns (1 <= N <= 150, number 1..N) after the terrible earthquake last May. The cows didn't have time to rebuild any extra roads, so now there is exactly one way to get from any given barn to any other barn. Thus, the farm transportation system can be represented as a tree. 

Farmer John wants to know how much damage another earthquake could do. He wants to know the minimum number of roads whose destruction would isolate a subtree of exactly P (1 <= P <= N) barns from the rest of the barns.

Input

* Line 1: Two integers, N and P 

* Lines 2..N: N-1 lines, each with two integers I and J. Node I is node J's parent in the tree of roads. 

Output

A single line containing the integer that is the minimum number of roads that need to be destroyed for a subtree of P nodes to be isolated. 

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

[A subtree with nodes (1, 2, 3, 6, 7, 8) will become isolated if roads 1-4 and 1-5 are destroyed.] 

Source


题意:给出n,p,一共有n个节点,要求最少减去最少的边是多少,剩下p个节点
思路:典型的树形DP,

dp[s][i]:记录s结点,要得到一棵j个节点的子树去掉的最少边数
 考虑其儿子k
 1)如果不去掉k子树,则
 dp[s][i] = min(dp[s][j]+dp[k][i-j])  0 <= j <= i

 2)如果去掉k子树,则
 dp[s][i] =  dp[s][i]+1
 总的为
 dp[s][i] = min (min(dp[s][j]+dp[k][i-j]) ,  dp[s][i]+1 )

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int root,brother[155],son[155],father[155];
int n,p;
int dp[155][155];
void dfs(int rt)
{
    for(int i=0;i<=p;i++)
       dp[rt][i]=10000000;
    dp[rt][1]=0;
    int k=son[rt];
    while(k)
    {
        dfs(k);
        for(int i=p;i>=1;i--)
        {
            int temp=dp[rt][i]+1;
            for(int j=1;j<i;j++)
               temp=min(temp,dp[rt][i-j]+dp[k][j]);
            dp[rt][i]=temp;
        }
        k=brother[k];
    }
}
int solve()
{
    dfs(root);
    int ans=dp[root][p];
    for(int i=1;i<=n;i++)
       ans=min(ans,dp[i][p]+1);
    return ans;
}
int main()
{
    while(~scanf("%d%d",&n,&p))
    {
        memset(brother,0,sizeof(brother));
        memset(son,0,sizeof(son));
        for(int i=1;i<n;i++)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            father[y]=x;
            brother[y]=son[x];
            son[x]=y;
        }
        for(int i=1;i<=n;i++)
        {
            if(!father[i])
            {
                root=i;
                break;
            }
        }
        printf("%d\n",solve());
    }
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

poj 1947 Rebuilding Roads 【树形DP】 【求至少删去树中 多少条边 使得树中节点数为P】

Rebuilding Roads Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 10066 ...

POJ 1947 Rebuilding Roads 树形dp

http://poj.org/problem?id=1947 题意:给你一棵有N个结点的树, 要求从树中剪掉一些边, 使得最后得到的子树恰好有P个结点。 思路:树形dp。用dp[i][j] 表示在...

poj 1947 Rebuilding Roads (树形dp)

题意说给你一棵树,问得到点数为p的子树至少要删除多少条边。 状态方程: 好好理解下状态方程。 /* -----------------------------------------------...

[poj 1947] Rebuilding Roads 树形DP

Rebuilding Roads Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 10653 Acce...
  • ALPS233
  • ALPS233
  • 2016年04月19日 15:34
  • 669

poj 1947 Rebuilding Roads(树形DP)

/* 问题描述:给定n个点的树,最少删多少边,会有棵p个节点的树 dp[i][j]代表以i为根(包含i),共j个节点需要切断的路的数量 dp[i][j+k]=min(f[i][j+k],f[i.son...
  • SYLG_li
  • SYLG_li
  • 2012年10月01日 11:19
  • 355

POJ 1947 Rebuilding Roads (树形dp + 01背包)

题目链接:http://poj.org/problem?id=1947题解:开一个dp数组,dp[i][j]表示以第i个节点为根,保留j个点所需要的刀数。可以先将所有dp[i][1]初始化为 i的儿子...

poj 1947 Rebuilding Roads 树形dp

poj 1947 Rebuilding Roads http://poj.org/problem?id=1947 题意:给定N个点,之间有路N-1条,且从一点到另一点只有一种走法,问去掉几条路,可...

树形DP(4) Poj1947 Rebuilding Roads

题目链接:http://poj.org/problem?id=1947  Rebuilding Roads Time Limit: 1000MS   Memory Limit:...

poj 1947 Rebuilding Roads 树形dp加背包

dp[i][j]记录以i为根的树保留j个结点的费用。 状态转移方程:dp[i][j]=min(dp[i][j], dp[i][j-k]+dp[s][k]-2) ,s为i的子结点,减2是i到s这条边分...

[POJ 1947] Rebuilding Roads 树形dp

http://poj.org/problem?id=1947题意:输入 n, m 表示一棵树有 n 个顶点,然后输入 n-1 条边,要求删除一些边使得树中剩下 m 个点,问最少要删除多少边。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu 1947 Rebuilding Roads(树形DP)
举报原因:
原因补充:

(最多只允许输入30个字)