樹上依賴揹包總結

2022-02-05 11:38:35 字數 578 閱讀 5589

做了很多關於樹上dp的題有些使用了nm^2的演算法來進行dp,可是當m過大時方法不大試用,又可以對這種演算法進行優化,如dfs序或者直接樹上合併揹包。當輸出方案時又需要多叉轉二叉進行dp尋找方案,很多方法於是乎總結一下。

w[i]表示第i個節點的重量,v[i]表示第i個節點的價值,f[i][j]表示以i為節點用了j的容量選出的最大值

1.直接樹上進行dp,強制選擇父親然後列舉全部能選的容量再枚舉子樹能選的容量進行轉移。向上更新。

void dfs(intx)}

2.相對於第乙個方法dp,本人感覺第二種優化的方法比較難理解。向下更新。

void dfs(int x)//

做這個操作需要設乙個超級源點}//

複雜度nm

3.多叉樹轉二叉樹,左兒子右兄弟。

void dfs(int i,int j)//

i為當前根節點,j為容積}//

複雜度應該為nm

多叉樹轉化是:rx[x]=ls[i];ls[i]=x;

4.dfs序優化。

暫時還不會,主要應用為第2種方法!

樹上揹包練習

p2014 ctsc1997 選課 p2014 ctsc1997 選課 solution 樹上揹包模板題 因為有多節課是沒有先修課的,所以並不是只有一棵樹,用乙個0號點作為沒有先修課的課程的先修課,這樣就合併成了一棵樹,只要選取m 1個點 必選0 即可。轉移方程 dp u j max dp u j ...

重建道路 樹上揹包

初始化 void init struct edges edge maxm 1 無向圖則需要乘2 inline void add int u,int v head u cnt int dp m m siz m tmp m int n,m void dfs int u,int fa siz u siz ...

動態規劃 樹上揹包

題意 每個頂點有兩個權值b和w。最多3000個節點的樹,分成恰好m個非空的連通塊,使得盡可能多的連通塊滿足w的和嚴格大於b的和。樹上揹包的套路題,這裡揹包 dp i j 表示以i為根的子樹,已經劃分了 j 個連通塊,包括根節點在內的最後乙個連通塊沒有劃分,能取到的最優值。這一題最優值看起來有兩維,但...