貪吃的九頭龍

2021-07-30 04:18:17 字數 2597 閱讀 2664

時間限制: 2 sec  

記憶體限制: 128 mb

提交: 57  

解決: 22 [

提交][

狀態][

我的提交]

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

有一天,有m

個腦袋的九頭龍看到一棵長有

n個果子的果樹,喜出望外,恨不得一口把它全部吃掉。可是必須照顧到每個頭,因此它需要把

n個果子分成

m組,每組至少有乙個果子,讓每個頭吃一組。

這m個腦袋中有乙個最大,稱為「大頭」,是眾頭之首,

它要吃掉恰好k

個果子,而且

k個果子中理所當然地應該包括唯一的乙個最大的果子

。果子由n-1

根樹枝連線起來,由於果樹是乙個整體,因此可以從任意乙個果子出發沿著樹枝「走到」任何乙個其他的果子。

對於每段樹枝,如果它所連線的兩個果子需要由不同的頭來吃掉,那麼兩個頭會共同把樹枝弄斷而把果子分開;如果這兩個果子是由同乙個頭來吃掉,

那麼這個頭會懶得把它弄斷而直接把果子連同樹枝一起吃掉。當然,吃樹枝並不是很舒服的,因此每段樹枝都有乙個吃下去的「難受值」,而九頭龍的難受值就是所有頭吃掉的樹枝的「難受值」之和。

九頭龍希望它的「難受值」盡量小,你能幫它算算嗎?

例如圖1

所示的例子中,果樹包含

8個果子,7

段樹枝,各段樹枝的「難受值」標記在了樹枝的旁邊。九頭龍有兩個腦袋,大頭需要吃掉

4個果子,其中必須包含最大的果子。即

n=8,

m=2,

k=4:

【輸入檔案】

輸入檔案

dragon.in的第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。

【輸出檔案】

輸出檔案

dragon.out

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

copy

(如果複製到控制台無換行,可以先貼上到文字編輯器,再複製)

8 2 4

1 2 20

1 3 4

1 4 13

2 5 10

2 6 12

3 7 15

3 8 5

4
樣例對應於題目描述中的例子。

分析:首先,最近嫌疑人x的獻身上映~\(≧▽≦)/~啦啦啦,然後雖然我沒有時間看,但看到這道題時瞬間想到了石神再監獄裡證明四色原理(23333333),然後差不多可以想象,這棵樹中,沒有三個節點互相相鄰的情況,所以一定可以用兩種顏色給樹染色,讓相鄰的節點顏色各不同,所以當m>2時只需要考慮大頭吃k個果子的消耗,(剩下的小頭此時》=2,一定可以0消耗吃完所有果子,就是用兩種顏色給樹染色,讓相鄰的節點顏色各不同)m=1時答案為w的和,重點在m=2時,(卡了我好久233333~qnq~)其實也差不多,m>2時只有父親被大頭吃了,他也被大頭吃了時才加當前代價,而m=2,時父親被大頭吃了,他也被大頭吃了和父親沒有被大頭吃,他也沒有被大頭吃兩種情況都要加上當前代價。

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

const int n=300+10;

const int inf=0x3f3f3f3f;

struct bianarr[n<<1];

struct nodetree[n];

void getint(int&num)

num*=flag;

}int n,m,p,cnt,a,b,w,all,fir[n],a[n],son[n],dp[n][n][2];

bool vis[n][n][2];

void link(int a,int b,int w)

void build(int x,int pre)

}void son(int x)

void dfs(int x,int k,bool flag)

if(k==1)

if(!tree[x].l&&!tree[x].r);

else if(!tree[x].l)

if(son[tree[x].r]>=k-1)

} else if(!tree[x].r)

if(son[tree[x].l]>=k-1)

} else{

for(int i=0;i<=k;i++){

if(son[tree[x].l]

貪吃的九頭龍

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

貪吃的九頭龍

題目描述 有一天,有m個腦袋的九頭龍看到一棵長有n個果子的果樹,想把果子一口全部吃掉。可是必須照顧到每個頭,因此它需要把n個果子分成m組,每組至少有乙個果子,讓每個頭吃一組。這m個腦袋中有乙個最大,稱為 大頭 是眾頭之首,它要吃掉恰好k個果子,而且k個果子中理所當然地應該包括唯一的乙個最大的果子。果...

樹形DP 貪吃的九頭龍

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