uva 1292(树形dp)
2015-07-16 00:04
441 查看
题意:有一个树,上面有n个结点,给出每个结点有边相连的直接相邻的点,问最少选几个点能让所有的边至少有一个结点被选中。
题解:树形dp简单题,把0当做根节点。
f[i][0]:不选i点,覆盖所有边的最少点
f[i][1]:选i点,覆盖所有边的最少点
状态转移方程:
f[u][1] += min(f[v][1], f[v][0]);//v是u的子节点,选u点子节点可以选或不选
f[u][0] += f[v][1];//不选u点就一定要选子节点,这样保证边能覆盖
题解:树形dp简单题,把0当做根节点。
f[i][0]:不选i点,覆盖所有边的最少点
f[i][1]:选i点,覆盖所有边的最少点
状态转移方程:
f[u][1] += min(f[v][1], f[v][0]);//v是u的子节点,选u点子节点可以选或不选
f[u][0] += f[v][1];//不选u点就一定要选子节点,这样保证边能覆盖
#include <stdio.h> #include <string.h> #include <vector> #include <algorithm> using namespace std; const int N = 1505; int n, f [2], vis ; vector<int> g ; //f[i][0]:不选i点,覆盖所有边的最少点 //f[i][1]:选i点,覆盖所有边的最少点 void dp(int node) { f[node][0] = 0; f[node][1] = 1; vis[node] = 1; int m = g[node].size(); for (int i = 0; i < m; i++) { int v = g[node][i]; if (!vis[v]) { dp(v); f[node][1] += min(f[v][1], f[v][0]); f[node][0] += f[v][1]; } } } int main() { while (scanf("%d", &n) == 1) { for (int i = 0; i <= n; i++) { g[i].clear(); vis[i] = 0; } int a, b, c; for (int i = 0; i < n; i++) { scanf("%d:(%d)", &a, &b); for (int j = 0; j < b; j++) { scanf("%d", &c); g[a].push_back(c); g[c].push_back(a); } } dp(0); printf("%d\n", min(f[0][0], f[0][1])); } return 0; }
相关文章推荐
- 从json获取坐标,生成地图覆盖物
- 基础阶段总结
- 201507152326_《Javascript实现跨域有4种方法——介绍jsonp和html5方法》
- Codeforces 558D Guess Your Way Out! II (区间覆盖+扫描线)
- C语言程序设计 6章
- [leetcode] Longest Palindromic Substring 多种解法
- 李咏什么癌症?癌症的真相:为自己为孩子,我们都应该读读这篇文章
- java 算法之快速排序实现代码
- java 中基本算法之希尔排序的实例详解
- java 算法之冒泡排序实例详解
- java 数据结构基本算法希尔排序
- Mysql锁和死锁分析
- .NET微信公众号开发之准备工作
- 详解Django中的ifequal和ifnotequal标签使用
- 在Python的Django框架中为代码添加注释的方法
- 详解Django中的过滤器
- Django框架下在视图中使用模版的方法
- 在Python的Django框架中加载模版的方法
- Django框架中render_to_response()函数的使用方法
- Django中使用locals()函数的技巧