树形DP初步(2)

来源:互联网 发布:caffe安装 编辑:程序博客网 时间:2024/05/21 18:35

话说刘汝佳的紫书关于树形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:一百元呢!

你啥都没听到。

原创粉丝点击