随笔 - 26  文章 - 6  trackbacks - 0
<2010年9月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

常用链接

留言簿(3)

随笔分类

随笔档案

朋友

  • cqh
  • 大学室友...

搜索

  •  

最新评论

阅读排行榜

评论排行榜

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 <iostream>
#define MAX 152
#define INF 0x3ffffff
using namespace std;

/*
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 )
*/


int dp[MAX][MAX];
int son[MAX], bla[MAX], root, n, p;
//son[i]:记录i结点的儿子,bla[i]:记录i结点的兄弟
bool hf[MAX];
//hf[i]:i结点是否有父亲

void dfs(int s)
{
    
int i, j, k, temp;
    
for(i = 0; i <= p; i++)
        dp[s][i] 
= INF;
    dp[s][
1= 0;
    k 
= son[s];
    
while(k){
        dfs(k);
        
for(i = p; i >= 0; i--){
            temp 
= dp[s][i]+1;
            
for(j = 0; j <= i; j++){
                
if(dp[k][i-j] + dp[s][j] < temp)
                    temp 
= dp[k][i-j] + dp[s][j];
            }

            dp[s][i] 
= temp;
        }

        k 
= bla[k];
    }

}


int slove(int root)
{
    dfs(root);
    
int i, ans;
    ans 
= dp[root][p];
    
for(i = 1; i <= n; i++){
        
if(dp[i][p] < ans)
            ans 
= dp[i][p] + 1;
    }

    
return ans;
}


int main()
{
    
//freopen("data.txt", "r", stdin);
    int i, s, t;
    
while(cin >> n >> p){
        memset(son, 
0sizeof(son));
        
for(i = 1; i < n; i++){
            cin 
>> s >> t;
            bla[t] 
= son[s];
            son[s] 
= t;
            hf[t] 
= true;
        }

        
for(i = 1; i <= n; i++){
            
if(!hf[i])
                root 
= i;
        }

        cout 
<< slove(root) << endl;
    }

    
return 0;
}
posted on 2009-05-15 11:37 longshen 阅读(2246) 评论(2)  编辑 收藏 引用 所属分类: poj

FeedBack:
# re: poj 1947 Rebuilding Roads -- 树形DP 2009-07-17 19:03 Winter Legend
HoHo ~
代码很直观啊 ~ 写得不错 ! 学习了~  回复  更多评论
  
# re: poj 1947 Rebuilding Roads -- 树形DP 2010-10-04 23:36 czy
good~好代码,膜拜  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理