poj1848 Tree
.....是我多想了。
我想开f[][0~3],看到百度上的题解都是[0~2]的,我就改了
方程不是特别难想。。
f代表最小代价
f[i][0]是子树有环过i
f[i][1]是子树除了i都成环了
f[i][2]是子树有条链过i(最少2个点,包括i)
转移见代码(有状态了转移很好想)。
/**
* Problem:POJ1848
* Author:Shun Yao
* Time:2013.9.2
* Result:Accepted
* Memo:TreeDP
*/ #include <cstdio> #define MAXN 110
#define inf 1000 long f[MAXN][3]; long min(long x, long y) {
return x < y ? x : y;
} class Edge {
public:
long v;
Edge *next;
Edge() {}
~Edge() {}
Edge(long V, Edge *ne) : v(V), next(ne) {}
} *g[MAXN]; void add(long x, long y) {
g[x] = new Edge(y, g[x]);
g[y] = new Edge(x, g[y]);
} void dp(long i, long pa) {
long sum;
Edge *e;
sum = 0;
for (e = g[i]; e; e = e->next)
if (e->v != pa) {
dp(e->v, i);
sum += f[e->v][0];
}
f[i][2] = inf;
f[i][0] = inf;
f[i][1] = sum;
if (g[i]->v == pa && !g[i]->next)
return;
static long x, y, z;
x = inf;
y = inf;
for (e = g[i]; e; e = e->next)
if (e->v != pa) {
f[i][2] = min(f[i][2], f[e->v][1] - f[e->v][0]);
f[i][2] = min(f[i][2], f[e->v][2] - f[e->v][0]);
f[i][0] = min(f[i][0], f[e->v][2] - f[e->v][0]);
z = min(f[e->v][1], f[e->v][2]) - f[e->v][0];
if (x > z) {
y = x;
x = z;
} else if (y > z)
y = z;
}
f[i][2] += sum;
if (y < inf)
f[i][0] = min(f[i][0], x + y);
f[i][0] += sum + 1;
} int main() {
static long n, i, u, v; #ifndef ONLINE_JUDGE
freopen("poj1848.in", "r", stdin);
freopen("poj1848.out", "w", stdout);
#endif scanf("%ld", &n);
for (i = 1; i < n; ++i) {
scanf("%ld%ld", &u, &v);
add(u, v);
}
dp(1, 0);
if (f[1][0] >= inf)
printf("-1");
else
printf("%ld", f[1][0]); fclose(stdin);
fclose(stdout);
return 0;
}
poj1848 Tree的更多相关文章
- POJ1848 Tree 【树形dp】
题目链接 POJ1848 题解 由题,一个环至少由三个点组成,一个点作为根时,可以单独成链,可以与其一个儿子成链,或者与其两个儿子成环,与其一个剩余链长度大于等于2的儿子成环. 那么我们设最小代价 \ ...
- [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法
二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...
- SAP CRM 树视图(TREE VIEW)
树视图可以用于表示数据的层次. 例如:SAP CRM中的组织结构数据可以表示为树视图. 在SAP CRM Web UI的术语当中,没有像表视图(table view)或者表单视图(form view) ...
- 无限分级和tree结构数据增删改【提供Demo下载】
无限分级 很多时候我们不确定等级关系的层级,这个时候就需要用到无限分级了. 说到无限分级,又要扯到递归调用了.(据说频繁递归是很耗性能的),在此我们需要先设计好表机构,用来存储无限分级的数据.当然,以 ...
- 2000条你应知的WPF小姿势 基础篇<45-50 Visual Tree&Logic Tree 附带两个小工具>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...
- Leetcode 笔记 110 - Balanced Binary Tree
题目链接:Balanced Binary Tree | LeetCode OJ Given a binary tree, determine if it is height-balanced. For ...
- Leetcode 笔记 100 - Same Tree
题目链接:Same Tree | LeetCode OJ Given two binary trees, write a function to check if they are equal or ...
- Leetcode 笔记 99 - Recover Binary Search Tree
题目链接:Recover Binary Search Tree | LeetCode OJ Two elements of a binary search tree (BST) are swapped ...
- Leetcode 笔记 98 - Validate Binary Search Tree
题目链接:Validate Binary Search Tree | LeetCode OJ Given a binary tree, determine if it is a valid binar ...
随机推荐
- "Principles of Reactive Programming" 之<Actors are Distributed> (2)
Actor Path 我们知道actor是有层级的(hierarchical),第.每个actor在它的父actor的名字空间下都有一个名字.这样就构成了一个树状的结构,就像是文件系统.每个actor ...
- spring IOC容器实例化Bean的方式与RequestContextListener应用
spring IOC容器实例化Bean的方式有: singleton 在spring IOC容器中仅存在一个Bean实例,Bean以单实例的方式存在. prototype 每次从容器中调用Bean时, ...
- /storage/sdcard, /sdcard, /mnt/sdcard 三者的区别
原文地址: /storage/sdcard, /sdcard, /mnt/sdcard 三者的区别 - petercao - 博客园 http://www.cnblogs.com/bluestorm/ ...
- Android 监听EditView中的文本改变事件
android中的编辑框EditText也比较常用,那比如在搜索框中,没输入一个字,下面的搜索列表就显示有包含输入关键字的选项,这个输入监听怎么实现的呢? 我们可以建一个例子,效果图如下: 我们可以监 ...
- C中如何调用C++函数、类内函数 \混编\链接
在C中如何调用C++函数的问题,简单回答是将函数用extern "C"声明,当被问及如何将类内成员函数声明时,一时语塞,后来网上查了下,网上有一翻译C++之父的文章可以作为解答,遂 ...
- node.js模块之util模块
util提供了各种使用的工具.require('util') to access them. Util.format(format,[..]) Returns a formatted string u ...
- 【剑指offer】判断二叉树是否为平衡二叉树
2013-09-03 14:16:51 面试题39:求二叉树的深度.判断二叉树是否为平衡二叉树 小结: 根据平衡二叉树的定义,需要判断每个结点,因此,需要遍历二叉树的所有结点,并判断以当前结点为根的树 ...
- 将非WPF window设为 WPF Window的Owner
如果WPF Content是寄宿在Win32 窗体或Windows Form中,则在WPF模块中可能不会存在WPF Window(WPF模块的根可能是个UserControl).如果在WPF模块中弹出 ...
- linux aio
前几天nginx的0.8.x正式成为stable,然后看了下代码,发现0.8加入了linux native aio的支持,我们知道在linux下有两种aio,一种是glibc实现的aio,这个比较烂, ...
- C#中父窗口和子窗口之间实现控件互操作
很多人都苦恼于如何在子窗体中操作主窗体上的控件,或者在主窗体中操作子窗体上的控件.相比较而言,后面稍微简单一些,只要在主窗体中创建子窗体的时候,保留所创建子窗体对象即可. 下面重点介绍前一种,目前常见 ...