博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 3452 Bonsai
阅读量:4349 次
发布时间:2019-06-07

本文共 1217 字,大约阅读时间需要 4 分钟。

HDU_3452

    设树整体的根为T,对于以i为根节点的一棵子树,f[i]表示断开这棵树中的叶子和T的联系所需的最小代价。要断开i这棵子树中的叶子和T的联系,那么就是要断开i的所有孩子为根的子树中的叶子和T的联系。这样对于i的任意一个孩子j,要么j的叶子本来就和i断开的联系,要么就断开i->j这条边,依据这一点就可以用dp自底向上求得每个f[i]了,f[T]即为最后结果。

#include
#include
#include
#define MAXD 1010#define MAXM 2010#define INF 0x3f3f3f3fint N, T, f[MAXD], first[MAXD], e, next[MAXM], v[MAXM], w[MAXM];void add(int x, int y, int z){ v[e] = y, w[e] = z; next[e] = first[x], first[x] = e ++;}void init(){ int i, x, y, z; memset(first, -1, sizeof(first[0]) * (N + 1)), e = 0; for(i = 1; i < N; i ++) { scanf("%d%d%d", &x, &y, &z); add(x, y, z), add(y, x, z); }}void dfs(int cur, int fa){ int i, flag = 0; f[cur] = 0; for(i = first[cur]; i != -1; i = next[i]) if(v[i] != fa) { flag = 1; dfs(v[i], cur); f[cur] += std::min(w[i], f[v[i]]); } if(flag == 0) f[cur] = INF;}void solve(){ dfs(T, -1); printf("%d\n", f[T]);}int main(){ while(scanf("%d%d", &N, &T), N) { init(); if(N == 1) printf("0\n"); else solve(); } return 0;}

转载于:https://www.cnblogs.com/staginner/archive/2012/09/03/2668193.html

你可能感兴趣的文章
session和cookie的区别
查看>>
oracle 数据库、实例、服务名、SID
查看>>
web.xml文件的作用
查看>>
linux下oracle调试小知识
查看>>
alert弹出窗口,点击确认后关闭页面
查看>>
oracle问题之数据库恢复(三)
查看>>
单点登陆(SSO)
查看>>
HR,也确实“尽职尽责”
查看>>
MaxComputer 使用客户端配置
查看>>
20190823 顺其自然
查看>>
阅读《余生有你,人间值得》有感
查看>>
每日英语
查看>>
20190914 防城港高级传销体验3日
查看>>
20190925 Phrase Of The Day
查看>>
20190925 软件实施
查看>>
python的命名空间
查看>>
*args 和 **kwargs 的区别
查看>>
洛谷P3372 【模板】线段树 1 分块
查看>>
【魔板】题解
查看>>
PDF数据防扩散系统介绍
查看>>