洛谷P2015 二叉蘋果樹

2022-04-06 03:52:14 字數 2031 閱讀 4837

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

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

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

2   5

\ /

3 4

\ /1

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

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

第1行2個數,nn和q

(1<=q

<=n

,1<

n<

=200)q

(1<=q

<=n

,1<

n<=2

00)。

n表示樹的結點數,q表示要保留的樹枝數量。接下來n−1

n−1行描述樹枝的資訊。

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

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

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

5 2

1 3 1

1 4 10

2 3 20

3 5 20

21
f[i

][j]

f[i]

[j] 表⽰以i節點為根,保留j個樹枝最多留下

多少個蘋果。

只給左⼉⼦:f[i

][j]

=f[l

son[

i]][

j−1]

+vls

on[i

]f[i

][j]

=f[l

son[

i]][

j−1]

+vls

on[i

]只給右⼉⼦:f[i

][j]

=f[r

son[

i]][

j−1]

+vrs

on[i

]f[i

][j]

=f[r

son[

i]][

j−1]

+vrs

on[i

]都分⼀點:f[i

][j]

=max

(f[l

son[

i]][

k]+f

[rso

n[i]

][j−

k−2]

+vls

on[i

],vr

son[

i]).

0<=k

<=j

−2f[

i][j

]=ma

x(f[

lson

[i]]

[k]+

f[rs

on[i

]][j

−k−2

]+vl

son[

i],v

rson

[i])

.0<=k

<=j

−2.另種思路在**中說明

#include#includeusing namespace std;

int n,q;

struct ben

a[205];

int f[205][205];

int cnt=1;

int head[205];//head[i]表示以i為起點的邊的編號

void add(int x,int y,int num)//連邊函式

void search(int dq,int father)

}} }

}int main()

//初始化

for(int i=1;isearch(1,0);

printf("%d",f[1][q]);

return 0;

}

洛谷 P2015 二叉蘋果樹

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

洛谷P2015 二叉蘋果樹

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

洛谷P2015 二叉蘋果樹

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