树的最小支配集
2015-09-07 19:53
260 查看
/** 最小支配集,就是图中用最少的点覆盖其它所有点 如果用选A点覆盖,则与A点相连的点都被覆盖,大致 就是这样 百度里面搜到一道题 有一个图G,现在希望在一些点建立控制站,每个控制站能控制与它相临的点(直接相连), 现在希望有选择的在一些点建立控制站,使得以最小得控制站数,控制所有的点 图的最小支配集是NP 问题,我只会树的最小支配集模板,就是 图G 是树形结构 判断树的最小支配集,条件如下 1、选一结点为根后序遍历 2、遍历过程中,如果该结点没被覆盖,该结点的父亲结点没被覆盖,且 该结点的子结点中没有被覆盖的,则该结点的父亲结点即为一覆盖点 就上面两个条件即可实现,证明不会,自己画画就能懂 现在用vector 存边来写下 #include <vector> vector<int> adj[M]; bool vis[M], over[M]; int ans; //初始化: vis, over, ans = 0 //调用dfs(1, 1), 选 1 为根节点 void dfs(int u, int fa) { //根节点判断可省去判断父亲结点 vis[u] = 1; bool flag = false; for (int i=0; i<adj[u].size(); i++) { int v = adj[u][i]; if (!vis[v]) { dfs(v, u); flag = flag || over[v]; } } if (!over[fa] && !flag && !over[u]) { //父亲结点没覆盖,没子结点覆盖,本身没覆盖,3个条件 over[fa] = 1; ans++; } } ans即为最小支配集得个数,over[x] 表示x点被覆盖 POJ 3659 */ 收藏于 2012-01-20 来自于百度空间
相关文章推荐
- 欧拉路 / 回路 / 有向/ 无向 / 字典顺序
- DP 最长公共子序列并标记输出
- 多重背包问题的二进制分解思想
- Processing 教程(10)- 多个对象的行为
- Java中的await()/signal()用法
- objective-c数据类型
- C 语言编程 #if 0 #endif和:#if 1 #endif
- BF 算法(Brute Force)
- 广播BroadcastReceiver
- 浮点公约数
- Mac安装Brew
- 用Java来实现一些简单的程序
- Velocity.js实现动画序列的三种方法
- 二叉树的非递归遍历,还有一点黑科技
- 【Linux高频命令专题(2)】awk
- 线程之死循环。
- 面向对象和面向过程
- 【codevs2039/USACO】 骑马修栅栏 图论算法之欧拉(回)路
- OpenGL教程翻译 第十五课 相机控制(二)
- 嵌入式开发板上安装telnetd服务