树形DP初步(2)

话说刘汝佳的紫书关于树形dp的代码少得很,似乎他把我们当成了大神犇,但神犇并不多,像我们这些蒟蒻看不到代码的话是很难理解解法的,即使理解了也撸不出,所以我站了出来(好像我是英雄似的)

上面的这些话别管,说这些话的是一个傻瓜。

今天讲讲树形dp初步的第二个内容树的重心(昨天那个内容在网上很难找到简单易懂的代码,我也是找了好久才找到易懂bfs解法的代码,然而打的时候忘了,再上网找又找不到,最后无奈自己根据刘汝佳大神DP法讲解手打了个DP的代码

题目链接(点击传送):http://poj.org/problem?id=1655














看完题目后就得乍样。

zyy表示呵呵呵:全是英文我也不怕,反正我有翻译加解释版本,题目的意思就是……嗯……

滚一边去,别剧透。其实这道题就是让你求树的重心,即选择一个结点删去,使得分出的 若干棵树的结点数 的最大值最小。

如这上面所述,树的重心指的就是选择一个结点删去,使得分出的 若干棵树的结点数 的最大值最小的这个点。

求法也很简单就是用一次dfs求出以某节点为根的子树的节点数,求这个数组的状态转移方程长这样:d(i)=∑d(j)+1,另外开一个变量记录在dfs时更新

大概长这样:

void dfs(int num)  
{  
    used[num] = 1;  
    d[num] = 0;  
    int max1 = 0;  
    for(int i=p[num];~i;i=a[i].next)  
        if(!used[a[i].to])  
        {  
             int u = a[i].to;
            dfs(u);  
            d[num] += d[u] ;  
            max1 = max(max1,d[u]);  
        }  
    d[num]=d[num]+1;
    max1 = max(max1,n-d[num]);  
    if(max1 < size || max1 == size && num < ans)  
    {  
        ans = num;  
        size = max1;  
    }  
}  

关于台风天气预报说今天来的,乍还没来,算了明天来更好,让台风刮得更猛烈些吧。











我打错文章题目了?zyy别乱说上一篇的题目不就是树形dp(1)。

zyy说到:你不信自己去看。

我赌100元没打错。

呵呵呵还真打错了。

zyy:一百元呢!

你啥都没听到。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值