傳送門
給乙個n個節點的樹,邊帶權值,要求保留q條連通根節點1的邊,求這q條邊最大總權值是多少。
算是乙個樹形揹包的模板題,可以將邊權轉化為子節點的點權來考慮分組揹包,注意本題中如果要選子節點,其父節點也必須被選。
ps.沒注意分組揹包的寫法wa了一發,
第一次for為枚舉子樹
第二次for為列舉當前節點的限重,也就是揹包限重,注意01揹包和完全揹包區別。
第三次for枚舉子樹重量。
#include #include#include
#include
using
namespace
std;
intn,q;
int head[110],to[210],nxt[210],len[210],tot,siz[110
];int f[110][110
];void add(int u,int v,int w)
void dfs(int u,int rt,int
w) f[u][
1]=w;
for(int i=head[u];i;i=nxt[i])
for(int j=min(q,siz[u]);j>=0;j--)
for(int k=1;k)
f[u][j]=max(f[u][j],f[u][j-k]+f[to[i]][k]);
}int
main()
q++;
dfs(
1,0,0
); printf(
"%d\n
",f[1
][q]);
return0;
}
洛谷 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現在這顆樹枝條太多了,需要剪枝。但是一些樹枝上長有蘋...