1. 程式人生 > >樹上dp的基本東西

樹上dp的基本東西

這是紫書P280~P282的讀書筆記

樹的最大獨立集

概念:在一個無根樹中選出一些互不相鄰的點,使這個集合最大
定義:d[i]為以i為根的子樹中最大獨立集的值,s[i]表示i的兒子,gs[i]表示孫子
方程:對於i點只有兩種狀態選或者不選,可以看成一個01揹包問題,轉移只有兩種:
d[i]=max(1+sum(d[j1]),sum(d[j2]));j1∈gs[i],j2∈s[i];sum是累加

注意的地方:
如果對於每一個需要計算的地方我們都要找出其所有的s和gs,不容易實現,
可以選擇:列舉到i點時,直接累加其fa和gf——–刷表法

樹的重心

概念:刪去節點i後的最大聯通塊的大小最小
應用:樹的點分治中避免x^2的極端情況(從退化鏈一端出發)
定義:d[i] 以i為根的子樹的大小
易得:

d[i]=js[i]d[j]+1
所以對於節點i來說,它若為重心的值即h[i]=max(d[j])+n-d[i]
求h[i]和d[i]的操作在無根樹轉有根時可一起完成

最遠點對

DFS:
兩次dfs即可,證明可用反證法

-

dp:
定義:d[i] 以i為根的子樹到葉子的最長距離(不能向上)
思路:經過i點的最長路徑是兒子最大值與次大值相加
所以:d[i]=maxd[j]+max2d[j]+2

-

拓展:對於一顆n個結點的無根樹,求出每個結點的最遠點,要求時間複雜度為O(n)

補充一下對於求樹直徑的dfs證明:
樹的直徑是樹上最長的一條邊
方法:任取一點u,用DFS求出其最長點v,對於v,再dfs(v),求出v的最遠點w,
v–w就是直徑

1°:若任取的一點u在直徑上,顯然u的最遠點v是直徑的一個端點.v的另一個端點w就是直徑的第二個端點
至於為什麼v是直徑的一個端點:我們假設存在一點x使得u-x的距離大於u-v的距離,因為u在直徑上所以以x是這條直徑上距離u較長一端的端點,這與v也是端點相矛盾,故v是直徑的一個端點.

2°:若這點u不在直徑上,我們不妨設這棵樹的兩個端點分別為v,w,我們通過兩次搜尋到的是x,y點.若x,y的路徑中有點與u,v重合那麼回到了第一種情況是正確的.若x,y與v,w完全不相交,因為是樹所以必定是一個聯通塊,一定有邊連線在u,v和x,y構成的兩個聯通塊中,所以直徑無疑是x,y與v,w之間的最遠點,所以又回到了第一種情況.
至此,所有情況討論完畢,均成立.
如上,證畢.

回到這個問題中:

方法:兩次dfs得到樹的直徑,然後分別從直徑的兩端出發,更新其最大值.
證明類似於上問 問題摸我

樹的dp的一些基本東西就在這裡~~
orz~~例題看我後面的部落格了(^o^)

相關推薦

樹上dp基本東西

這是紫書P280~P282的讀書筆記 樹的最大獨立集 概念:在一個無根樹中選出一些互不相鄰的點,使這個集合最大 定義:d[i]為以i為根的子樹中最大獨立集的值,s[i]表示i

bzoj1040 基環樹上dp

math bzoj 其中 期待 不存在 clas 數據 nbsp ostream 【bzoj1040】[ZJOI2008]騎士 2014年2月26日5,2040 Description Z國的騎士團是一個很有勢力的組織,幫會中匯聚了來自各地的精英。他們劫富濟貧

洛谷P2458[SDOI2006]保安站崗 題解 樹上DP

return 重復 獨立 arr 常用 圖片 保存 根據 準備 題目描述 五一來臨,某地下超市為了便於疏通和指揮密集的人員和車輛,以免造成超市內的混亂和擁擠,準備臨時從外單位調用部分保安來維持交通秩序。 已知整個地下超市的所有通道呈一棵樹的形狀;某些通道之間可以互相望見。總

codeforces 955F Cowmpany Cowmpensation 樹上DP+多項式插值

給一個樹,每個點的權值為正整數,且不能超過自己的父節點,根節點的最高權值不超過D 問一共有多少種分配工資的方式? 題解: A immediate simple observation is that we can compute the answer in $O(nD) $with a simple d

如何燒寫TQ210 E8板子的基本東西

首先,當然是需要配置好電腦上面的環境 ========= SecureCRT (這個是用串列埠來連線的,也就相當於一個串列埠除錯工具,我們主要拿來操作板子裡面的linux系統,輸入等比較方便) (這就是介面截圖,現在是連線好了的,而且系統也是以及燒成功了的 所

dfs+基環樹上dp--HDU 6403 Card Game

闆闆講的題! 把每張牌看成一條邊,正面向反面連權值為1的邊,反之為0 每個點只能有<=1個入度 可以看出只有樹或者基環樹才是合法的 所以就只要在樹或者基環樹上dp就好了 這個dp可以先定一個根,因為一定有一個點是入度為0的,先求出這個值,然後可以dp求出以其他

Wannafly挑戰賽27 C 藍魔法師(樹上dp)

連結:https://ac.nowcoder.com/acm/contest/215/C 來源:牛客網   時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 262144K,其他語言524288K 64bit IO Format: %lld 題目描述 “你,你認錯

CF708C 【Centroids】樹上DP

洛谷同步部落格 1.我們先來簡化一下問題 如果題目不讓我們改造這棵樹,就很好求了。 先求出 s i

upc 6360: 詞韻(字典樹上dp

6360: 詞韻 時間限制: 2 Sec  記憶體限制: 128 MB 提交: 134  解決: 18 [提交] [狀態] [討論版] [命題人:admin] 題目描述 Adrian 很喜歡詩歌中的韻。他認為,兩個單詞押韻當且僅當它們的最長公共 字尾的長度至少是其中

汕頭市選2014 分叉___dfs+樹上dp

題目大意: 給出一棵N 個點的樹,點的編號是1, 2,。。。,N。 對於3 個點{a,b,c},如果不存在一條簡單路徑同時經過a,b,c,那麼{a,b,c}是一個分叉。 統計不同分叉的數量。 樹 無環,連通的無向圖 簡單路徑 不重複經過同一個點的路徑

Codeforces 842C Ilya And The Tree(樹上DP+因子個數估計)

C. Ilya And The Tree time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard output

樹上dp入門

樹形dp就是把操作放在樹上。 1. P1352 沒有上司的舞會 ——樹的最大獨立集 題意:上司如果參加酒會,下屬就不去了。很容易想到上司和員工之間的關係就是父節點與子節點的關係,用boss[i]來儲存i的父節點編號。因為編號是1-n的嘛,我們就初始化boss[]為0,然後

Codeforces815C Karen And SuperMarket 解題報告【樹上DP/樹上揹包(?)】

On the way home, Karen decided to stop by the supermarket to buy some groceries. She needs to buy a lot of goods, but since she

動態規劃入門(二)DP 基本思想 具體實現 經典題目 POJ1088

(一) POJ1088,動態規劃的入門級題目。嘿嘿,連題目描述都是難得一見的中文。 題目分析: 求最長的滑雪路徑,關鍵是確定起點,即從哪開始滑。 不妨設以( i, j )為起點,現在求滑行的最長路徑。 首先,( i, j )能滑向的無非就是它四周比它低的點。到底滑向哪個點?

Codeforces Round #526 (Div. 2) D. The Fair Nut and the Best Path 樹上dp

push ret 起點 air and second eof The bit D. The Fair Nut and the Best Path 題意:給出一張圖 點有權值 邊也要權值 從任意點出發到任意點結束 到每個點的時候都可以獲得每個點的權值,而從邊走的時候都要消耗改

關於yum的一些基本東西

信息 基本 處理 bsp 數據庫文件 服務器 操作 centos 歷史 1 sqlite數據庫的使用 第一,某個centos版本的包相關的信息都放在一個服務器端的sqlite數據庫文件中,yum會下載到本地,進行包安裝的時候用。 第二,安裝的歷史記錄放在sqlite數據庫中

【BZOJ4033】[HAOI2015]樹上染色 樹形DP

復雜度 put inline getc 距離 turn bsp 樹形 light 【BZOJ4033】[HAOI2015]樹上染色 Description 有一棵點數為N的樹,樹邊有邊權。給你一個在0~N之內的正整數K,你要在這棵樹中選擇K個點,將其染成黑色,並將其

HDU 5956 The Elder (樹上斜率DP)

continue 進行 clas pri 給定 題意 sig 復雜度 long 題意:給定上一棵樹,然後每條邊有一個權值,然後每個點到 1 的距離有兩種,第一種是直接回到1,花費是 dist(1, i)^2,還有另一種是先到另一個點 j,然後兩從 j 向1走,當然 j 也可

最近在寫一些樹上東西,先發一波LCA的吧!

++ html str long ace efi algorithm quest http 不會樹剖的我只有去學tarjan和倍增了,個人覺得倍增比tarjan好打一點。。。 tarjan學習的地方 http://www.cnblogs.com/JVxie/p/485471

作為軟件開發人員應該知道的最基本東西

afr afa v2x vml pro uga sad vpp ccf uh72si伊懇4uka84http://shufang.docin.com/sina_6364870792 z23競6f銜醬9輪Hhttp://tushu.docin.com/sina_626720