樹形DP 二叉蘋果樹

2021-10-02 03:29:42 字數 949 閱讀 3238

有一棵二叉蘋果樹,如果樹枝有分叉,一定是分兩叉,即沒有只有乙個兒子的節點。

這棵樹共 n 個節點,編號為 1 至 n,樹根編號一定為 1。

我們用一根樹枝兩端連線的節點編號描述一根樹枝的位置。

一棵蘋果樹的樹枝太多了,需要剪枝。但是一些樹枝上長有蘋果,給定需要保留的樹枝數量,求最多能留住多少蘋果。

這裡的保留是指最終與1號點連通。

輸入格式

第一行包含兩個整數 n 和 q,分別表示樹的節點數以及要保留的樹枝數量。

接下來 n−1 行描述樹枝資訊,每行三個整數,前兩個是它連線的節點的編號,第三個數是這根樹枝上蘋果數量。

輸出格式

輸出僅一行,表示最多能留住的蘋果的數量。

資料範圍

1≤q輸入樣例:

5 21 3 1

1 4 10

2 3 20

3 5 20

輸出樣例:

21有點像有依賴的揹包,這裡用樹形dp來做,我們用f[i][j]表示以i為根保留m條邊的權值和。

所以我們遍歷每乙個節點,在樹上跑一遍揹包就可以了。

#include

using

namespace std;

const

int n=

105,m=n*2;

int f[n]

[n],m,n,ne[m]

,h[m]

,e[m]

,w[m]

,cnt,ans;

void

add(

int a,

int b,

int c)

void

dfs(

int u,

int fa)}}

}int

main()

dfs(1,

-1);

cout<[m]<}

二叉蘋果樹 樹形DP

題意 description 有一棵蘋果樹,如果樹枝有分叉,一定是分2叉 就是說沒有只有1個兒子的結點 這棵樹共有n個結點 葉子點或者樹枝分叉點 編號為1 n,樹根編號一定是1。我們用一根樹枝兩端連線的結點的編號來描述一根樹枝的位置。下面是一顆有4個樹枝的樹 2 5 3 4 1 現在這顆樹枝條太多了...

二叉蘋果樹(樹形DP)

原題 顯然我們考慮這道題目可以很蠢的寫乙個dp對吧。考慮 dp i,j 表示以i為根,保留j個節點的最大蘋果數。然後就可以樹形dp的寫了。include include include include include include include define ll long long defin...

二叉蘋果樹 樹形dp

p2015 二叉蘋果樹 洛谷 電腦科學教育新生態 luogu.com.cn 嗚嗚嗚嗚,真的是一道厲害題 至少對目前的我來說 研究了乙個小時。首先,因為我們不知道一對座標中,誰是父親,誰是兒子,所以用無向圖把二者連起來,但最後dfs的時候還是只用其中乙個。狀態表示 i的子樹上保留j條邊時蘋果的最大值 ...