P2015 二叉蘋果樹(樹上揹包)

2022-06-18 02:12:13 字數 1199 閱讀 1592

有一棵蘋果樹,如果樹枝有分叉,一定是分2叉(就是說沒有只有1個兒子的結點)

這棵樹共有n個結點(葉子點或者樹枝分叉點),編號為1-n,樹根編號一定是1。

我們用一根樹枝兩端連線的結點的編號來描述一根樹枝的位置。下面是一顆有4個樹枝的樹

2   5

\ /

3 4

\ /1

現在這顆樹枝條太多了,需要剪枝。但是一些樹枝上長有蘋果。

給定需要保留的樹枝數量,求出最多能留住多少蘋果。

第1行2個數,n和q(1<=q<= n,1n表示樹的結點數,q表示要保留的樹枝數量。接下來n-1行描述樹枝的資訊。

每行3個整數,前兩個是它連線的結點的編號。第3個數是這根樹枝上蘋果的數量。

每根樹枝上的蘋果不超過30000個。

乙個數,最多能留住的蘋果的數量。

非常入門的樹上揹包問題,注意跑01揹包的時候一定一定要從大到小遍歷容量!!!

#includeusing

namespace

std;

const

int maxn=1010

;typedef

long

long

ll;int dp[maxn][maxn];//

dp(i,j)表示在以i為根的子樹裡選擇j個枝條的最優解

intn,q;

struct

node edge[maxn];

inthead[maxn];

inttot;

int size[maxn];//

以i為根的子樹的節點數量,枝條為子樹節點數-1

void addedge (int u,int v,int

w) void dfs1 (int u,int

pre)

}void dfs2 (int u,int

pre) }}

}int

main ()

dfs1(

1,0);

dfs2(

1,0);

int ans=0

;

for (int i=0;i<=min(q,size[1]);i++) ans=max(ans,dp[1

][i]);

printf(

"%d\n

",ans);

}

P2015 二叉蘋果樹 樹上揹包入門

題目鏈結 題意 給定一棵樹,每條邊有權重,問如果只保留e條邊,最多能保留多大權重 保留e條邊,不容易分析,轉化成保留e 1個點,權重放給孩子節點 問題轉化成 保留包括根節點在內的e 1個節點,求最大權重和 建樹方式 鏈式前向星,建雙邊 由此轉化成樹上01揹包問題 dp rt m 以rt為根,保留根節...

P2015二叉蘋果樹 (樹上DP)

p2015 二叉蘋果樹 提交15.30k 通過7.27k 時間限制 1.00s 記憶體限制 125.00mb 提交答案 加入收藏 題目提供者 洛谷難度 普及 提高 歷史分數 100提交記錄 檢視題解 標籤進入討論版 相關討論 推薦題目 展開題目描述 有一棵蘋果樹,如果樹枝有分叉,一定是分2叉 就是說...

P2015 二叉蘋果樹

這道題的dp還是先更新子節點,在更新父節點,不過問題就是怎樣更新他們 我們定義ff i j 為第i個節點字數上共保留j條邊的情況下最多的蘋果數,對於每乙個點,他保留的邊必然是他直接保留的之前保留的邊和他當前兒子保留的邊的值的和加上這一條邊的 邊權,即ff u i max ff u i f u i j...