P2015 二叉蘋果樹

2022-08-26 08:21:09 字數 994 閱讀 3432

有一棵蘋果樹,如果樹枝有分叉,一定是分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個。

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

輸入

5 2

1 3 1

1 4 10

2 3 20

3 5 20

輸出

21
#include#include#include#include#includeusing namespace std;

const int n=110;

int n,q,g;

int flag[n];

int f[n][n];

struct node tree[10*n];

void dfs(int i,int j)

} return;

}int main() else

} for(int i=1; i<=n; i++)

if(flag[i]==0)

dfs(g,q+1);

printf("%d\n",f[g][q+1]);

return 0;

}

P2015 二叉蘋果樹

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

P2015 二叉蘋果樹

題面 設f u i 表示u的子樹上保留i條邊,至多保留的蘋果數目 那麼狀態轉移方程也就顯而易見了 f u i max f u i f u i j 1 f v j e i w 1 i min q,sz u 0 j min sz v i 1 u表示當前節點,v是u的乙個子節點,sz u 表示u的子樹上的...

題解 P2015 二叉蘋果樹

題目鏈結 mathcal 這題是我在某奧賽一本通 提高篇 樹形dp中的第一道例題,抱著試一試的心態,本蒟蒻嘗試了這道題。在過了n小時後,終於做出了這題 以上純屬扯淡 首先,我們仔細看一下題目,可以發現 這是一棵樹呀!所以,我們就需要用到樹上dp。那麼,我們應該怎麼設定狀態呢?上面這張醜陋的圖,紅色的...