UVA - 1220 Party at Hali-Bula 树的最大独立集
题意: 给定n个人,存在上下级关系,每个人只有一个上级,求最大独立集。并判断最大独立集是否唯一
思路:d[i][0]表示以i为根的子树中,不选择第i个节点的最大独立集,f[i][0]表示以i为根的子树中,不选择第i个节点的方案是否唯一。同理,d[i][1]和f[i][1]就是选择第i个节点的情况。
状态转移:d[i][0] =
∑max(d[v][0], d[v][1]), d[i][1] =
∑d[v][0];
唯一性的转移方程见代码:
if(k == 1) { //选择节点u d[u][k] += dfs(v, 0); //不选择子节点 if(!f[v][0]) f[u][k] = 0; } else { d[u][k] += max(dfs(v, 1), dfs(v, 0)); if(d[v][0] == d[v][1]) f[u][k] = 0; else if(d[v][0] > d[v][1] && !f[v][0]) f[u][k] = 0; else if(d[v][1] > d[v][0] && !f[v][1]) f[u][k] = 0; }
AC代码:
#include<cstdio> #include<algorithm> #include<cstring> #include<utility> #include<string> #include<iostream> #include<map> #include<set> #include<vector> #include<queue> #include<stack> using namespace std; #define eps 1e-10 #define inf 0x3f3f3f3f #define PI pair<int, int> const int maxn = 200 + 5; map<string, int>name; vector<int>son[maxn]; int cnt, d[maxn][2], f[maxn][2]; int getID(string &p) { if(!name.count(p)) name[p] = cnt++; return name[p]; } int dfs(int u, int k) { f[u][k] = 1; d[u][k] = k; int n = son[u].size(); for(int i = 0; i < n; ++i) { int v = son[u][i]; if(k == 1) { //选择节点u d[u][k] += dfs(v, 0); //不选择子节点 if(!f[v][0]) f[u][k] = 0; } else { d[u][k] += max(dfs(v, 1), dfs(v, 0)); if(d[v][0] == d[v][1]) f[u][k] = 0; else if(d[v][0] > d[v][1] && !f[v][0]) f[u][k] = 0; else if(d[v][1] > d[v][0] && !f[v][1]) f[u][k] = 0; } } return d[u][k]; } int main() { int n, root; string boss, kid; while(scanf("%d", &n) == 1 && n) { for(int i = 0; i < n; ++i) son[i].clear(); name.clear(); cnt = 0; cin >> boss; getID(boss); for(int i = 1; i < n; ++i) { cin >> kid >> boss; int par = getID(boss), kids = getID(kid); son[par].push_back(kids); } int ans = max(dfs(0, 0), dfs(0, 1)); printf("%d ", ans); int only = 1; if(d[0][0] == d[0][1]) only = 0; else if(d[0][0] > d[0][1] && !f[0][0]) only = 0; else if(d[0][1] > d[0][0] && !f[0][1]) only = 0; if(only) printf("Yes\n"); else printf("No\n"); } return 0; }
如有不当之处欢迎指出!
UVA - 1220 Party at Hali-Bula 树的最大独立集的更多相关文章
- UVa 1220 Hali-Bula的晚会(树的最大独立集)
https://vjudge.net/problem/UVA-1220 题意: 公司里有n个人形成一个树状结构,即除了老板以外每个员工都有唯一的直属上司.要求选尽量多的人,但不能同时选择一个人和他的直 ...
- POJ 3342 Party at Hali-Bula / HDU 2412 Party at Hali-Bula / UVAlive 3794 Party at Hali-Bula / UVA 1220 Party at Hali-Bula(树型动态规划)
POJ 3342 Party at Hali-Bula / HDU 2412 Party at Hali-Bula / UVAlive 3794 Party at Hali-Bula / UVA 12 ...
- UVa 1220 - Party at Hali-Bula(树形DP)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- POJ 2342 树的最大独立集
题意:在树的最大独立集的基础上,加上权值.求最大. 分析: 采用刷表的方式写记忆化,考虑一个点选和不选,返回方式pair 型. 首先,无根树转有根树,dp(root). 注意的是:u不选,那么他的子节 ...
- POJ 3342 Party at Hali-Bula (树形dp 树的最大独立集 判多解 好题)
Party at Hali-Bula Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5660 Accepted: 202 ...
- 求树的最大独立集,最小点覆盖,最小支配集 贪心and树形dp
目录 求树的最大独立集,最小点覆盖,最小支配集 三个定义 贪心解法 树形DP解法 (有任何问题欢迎留言或私聊&&欢迎交流讨论哦 求树的最大独立集,最小点覆盖,最小支配集 三个定义 最大 ...
- HDU - 1520 Anniversary party (树的最大独立集)
Time limit :1000 ms :Memory limit :32768 kB: OS :Windows There is going to be a party to celebrate t ...
- UVa 1220 (树的最大独立集) Party at Hali-Bula
题意: 有一棵树,选出尽可能多的节点是的两两节点不相邻,即每个节点和他的子节点只能选一个.求符合方案的最大节点数,并最优方案判断是否唯一. 分析: d(u, 0)表示以u为根的子树中,不选u节点能得到 ...
- Uva 1220,Hali-Bula 的晚会
题目链接:https://uva.onlinejudge.org/external/12/1220.pdf 题意: 公司n个人,形成一个数状结构,选出最大独立集,并且看是否是唯一解. 分析: d(i) ...
随机推荐
- maven部署项目遇到的问题
在构建maven hibernate时候的exception 错误原因:通过maven dependency引入了hibernate5.2.10 final 而hibernate-core中没有上述该 ...
- JAVA中利用反射机制进行对象和Map相互转换的方法
JAVA的反射机制主要作用是用来访问对象的属性.方法等等.所以,JAVA中对象和Map相互转换可以利用JAVA的反射机制来实现.例子如下: 一.对象转Map的方法 public static Map& ...
- Nginx的安装(笔记)
0, 先决条件Nginx 依赖 zlib zlib-devel gcc-c++ libtool openssl openssl-devel pcre安装命令:yum -y install make z ...
- 【转】awk 里的substr函数用法举例
awk 里的substr函数用法举例: 要截取的内容:2007-08-04 04:45:03.084 - SuccessfulTradeResult(status: 1, currencyPair: ...
- AutoDesk Forge 获取令牌认证
创建应用程序 在开始使用Forge Platform之前,您需要设置一个应用程序并获取您的客户端ID和密码. 步骤1:登录Dev Portal 去开发门户网站:https://developer.au ...
- 介绍一种非常好用汇总数据的方式GROUPING SETS
介绍 对于任何人而言,用T-SQL语句来写聚会查询都是工作中重要的一环.我们大家也都很熟悉GROUP BY子句来实现聚合表达式,但是如果打算在一个结果集中包含多种不同的汇总结果,可能会比较麻烦.我将举 ...
- vue2.0使用slot插槽分发内容
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 二维码开源库ZBar-吐槽篇
前不久在网上看到一篇文章<QR-Decoder-OV5640 二维码识别> ,是某开发板的教程.记得对应的开发板以前购买过,当初只是为了看OV5640的JPG的输出效果,结果由于公司奇葩的 ...
- 安装Spring Tool Suite(STS)
JAVA开发工具中,常用工具就是Eclipse,IntelliJ IDEA. 现在使用spring boot&cloud框架进行开发的时候,虽然可以使用上面两个工具,但都未必就真的量身定制,I ...
- Python编程软件的安装与使用——Windows、Linux和Mac
Python版本:3.6.2 操作系统:Windows 作者:SmallWZQ 最近,有读者透露:Python软件如何安装?为什么自己安装的软件会有各种"奇怪"的问题?据此,本 ...