樹形dp Jzoj P1162 貪吃的九頭龍

2022-09-18 01:03:09 字數 1275 閱讀 4035

description

傳說中的九頭龍是一種特別貪吃的動物。雖然名字叫「九頭龍」,但這只是說它出生的時候有九個頭,而在成長的過程中,它有時會長出很多的新頭,頭的總數會遠大於九,當然也會有舊頭因衰老而自己脫落。

有一天,有m個腦袋的九頭龍看到一棵長有n個果子的果樹,喜出望外,恨不得一口把它全部吃掉。可是必須照顧到每個頭,因此它需要把n個果子分成m組,每組至少有乙個果子,讓每個頭吃一組。

這m個腦袋中有乙個最大,稱為「大頭」,是眾頭之首,它要吃掉恰好k個果子,而且k個果子中理所當然地應該包括唯一的乙個最大的果子

input

輸入檔案的第1行包含三個整數n (1<=n<=300),m (2<=m<=n),k (1<=k<=n)。 n個果子依次編號1,2,...,n,且最大的果子的編號總是1。第2行到第n行描述了果樹的形態,每行包含三個整數a (1<=a<=n),b (1<=b<=n),c (0<=c<=10^5),表示存在一段難受值為c的樹枝連線果子a和果子b。

output

輸出檔案僅有一行,包含乙個整數,表示在滿足「大頭」的要求的前提下,九頭龍的難受值的最小值。如果無法滿足要求,輸出-1。

sample input

8 2 4

1 2 20

1 3 4

1 4 13

2 5 10

2 6 12

3 7 15

3 8 5

sample output

4

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7struct edge e[610];8

int n,m,k,size[310],f[310][310][2],head[310

],cnt;

9void insert(int x,int y,int z)

10void dp(int x,int

fa)1128}

29}30int

main()

3134

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

3540 memset(f,60,sizeof

(f));

41 dp(1,0

);42 printf("

%d",f[1][k][1

]);43

return0;

44 }

樹形DP 貪吃的九頭龍

題意 思路首先,判斷是否有解是十分簡單的。我們只需要看在給每個小頭分配1個,大頭分配k個的情況下,所需要的果子的數量是否大於了蘋果的總數。也就是m k是否 n。接下來就是有解的情況了。首先我們需要知道,再分配好大頭之後,剩下的果子必然存在一種分配方式,使得九頭龍的難受值不會再增加。我們可以先考慮一堆...

貪吃的九頭龍

傳說中的九頭龍是一種特別貪吃的動物。雖然名字叫 九頭龍 但這只是說它出生的時候有九個 頭,而在成長的過程中,它有時會長出很多的新頭,頭的總數會遠大於九,當然也會有舊頭因衰老而自己脫落。有一天,有 m 個腦袋的九頭龍看到一棵長有 n個果子的果樹,喜出望外,恨不得一口把它全部吃掉。可是必須照顧到每個頭,...

貪吃的九頭龍

時間限制 2 sec 記憶體限制 128 mb 提交 57 解決 22 提交 狀態 我的提交 傳說中的九頭龍是一種特別貪吃的動物。雖然名字叫 九頭龍 但這只是說它出生的時候有九個頭,而在成長的過程中,它有時會長出很多的新頭,頭的總數會遠大於九,當然也會有舊頭因衰老而自己脫落。有一天,有m 個腦袋的九...