洛穀 P2015 二叉蘋果樹

來源:互聯網
上載者:User

標籤:tar   min   get   int   val   pre   targe   https   problem   

題目描述

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

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

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

2 5 \ / 3 4 \ / 1 現在這顆樹枝條太多了,需要剪枝。但是一些樹枝上長有蘋果。

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

輸入輸出格式輸入格式:

 

第1行2個數,N和Q(1<=Q<= N,1<N<=100)。

N表示樹的結點數,Q表示要保留的樹枝數量。接下來N-1行描述樹枝的資訊。

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

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

 

輸出格式:

 

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

 

輸入輸出範例輸入範例#1:
5 21 3 11 4 102 3 203 5 20
輸出範例#1:
21
  寫法和洛穀2014是一樣的 不過是根是1而已 屠龍寶刀點擊就送
#include <cstdio>#include <vector>#define N 205using namespace std;vector<pair<int,int> >G[N];inline int max(int a,int b) {return a>b?a:b;}inline int min(int a,int b) {return a>b?b:a;}int x,y,z,n,q,f[N][N];int dfs(int now,int pre){    int num=0;    for(int i=0;i<G[now].size();++i)    {        int v=G[now][i].first,val=G[now][i].second;        if(v==pre) continue;        num+=dfs(v,now)+1;        for(int j=min(num,q);j>=1;--j)         for(int k=j-1;k>=0;--k)          f[now][j]=max(f[now][j],f[now][j-k-1]+f[v][k]+val);    }    return num;}int main(){    scanf("%d%d",&n,&q);    for(int i=1;i<n;++i)    {        scanf("%d%d%d",&x,&y,&z);        G[x].push_back(make_pair(y,z));        G[y].push_back(make_pair(x,z));      }    dfs(1,0);    printf("%d\n",f[1][q]);    return 0;}

 

洛穀 P2015 二叉蘋果樹

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.