POJ 3342 Party at Hali-Bula (树形dp 树的最大独立集 判多解 好题)
| Time Limit: 2000MS | Memory Limit: 65536K | |
| Total Submissions: 5660 | Accepted: 2022 |
Description
Dear Contestant,
I'm going to have a party at my villa at Hali-Bula to celebrate my retirement from BCM. I wish I could invite all my co-workers, but imagine how an employee can enjoy a party when he finds his boss among the guests! So, I decide
not to invite both an employee and his/her boss. The organizational hierarchy at BCM is such that nobody has more than one boss, and there is one and only one employee with no boss at all (the Big Boss)! Can I ask you to please write a program to determine
the maximum number of guests so that no employee is invited when his/her boss is invited too? I've attached the list of employees and the organizational hierarchy of BCM.
Best,
--Brian Bennett
P.S. I would be very grateful if your program can indicate whether the list of people is uniquely determined if I choose to invite the maximum number of guests with that condition.
Input
The input consists of multiple test cases. Each test case is started with a line containing an integer
n (1 ≤ n ≤ 200), the number of BCM employees. The next line contains the name of the Big Boss only. Each of the following
n-1 lines contains the name of an employee together with the name of his/her boss. All names are strings of at least one and at most 100 letters and are separated by blanks. The last line of each test case contains a single 0.
Output
For each test case, write a single line containing a number indicating the maximum number of guests that can be invited according to the required condition, and a word Yes or No, depending on whether the list of guests is unique
in that case.
Sample Input
6
Jason
Jack Jason
Joe Jack
Jill Jason
John Jack
Jim Jill
2
Ming
Cho Ming
0
Sample Output
4 Yes
1 No
Source
题目链接:http://poj.org/problem?id=3342
题目大意:一棵树,父亲和儿子不能同一时候选入同一个集合,如今求能选集合中元素个数最多的那个集合大小。并推断解是否唯一
题目分析:求树的最大独立集的问题。好题,也用了两次dp的思想,有点类似HDU 5282这题的思想
dp[i][0]表示不选第i个结点,集合大小的最大值
dp[i][1]表示选第i个结点,集合大小的最大值
对于此dp显然
dp[i][1] = dp[son][0] 选父亲则不能选儿子
dp[i][0] = max(dp[son][0], dp[son][1]) 不选父亲的话则值等于选儿子或者不选儿子里的较大值
s[i][1] == true 表示选第i个结点时有唯一解,false表示解不唯一
s[i][0] == true 表示不选第i个结点时有唯一解。false表示解不唯一
開始时设s[i][1],s[i][0]都为true,对于此dp。我们主要考虑父亲的解变成不唯一的情况
与第一个dp状态相应,分成选父亲和不选父亲两种情况
if(!s[son][0]) s[i][1] = false,意思是假设不选儿子时有多个解,则此时能够选父亲,选父亲也肯定有多个解
if(dp[son][0] == dp[son][1]) s[i][0] = false。假设选不选儿子的答案同样。显然不选父亲时有多个解,由于选不选儿子都能够
最后自叶子向根回溯求解推断就可以。这题由于map没清零,wa了大半天。
。。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <vector>
#include <map>
#include <iostream>
using namespace std;
int const MAX = 300;
int n;
int dp[MAX][2];
bool s[MAX][2];
bool vis[MAX];
vector <int> vt[MAX]; void DFS(int fa)
{
dp[fa][1] = 1;
vis[fa] = true;
s[fa][0] = true;
s[fa][1] = true;
int sz = vt[fa].size();
for(int i = 0; i < sz; i++)
{
int son = vt[fa][i];
if(!vis[son])
{
DFS(son);
dp[fa][1] += dp[son][0];
dp[fa][0] += max(dp[son][0], dp[son][1]);
if(dp[son][0] == dp[son][1])
s[fa][0] = false;
if(!s[son][0])
s[fa][1] = false;
}
}
return;
} int main()
{
while(scanf("%d", &n) != EOF && n)
{
map <string, int> mp;
for(int i = 0; i < MAX; i++)
vt[i].clear();
memset(vis, false, sizeof(vis));
memset(dp, 0, sizeof(dp));
int cnt = 0;
string boss, fir, sec;
cin >> boss;
mp[boss] = cnt ++;
for(int i = 0; i < n - 1; i++)
{
cin >> sec >> fir;
if(!mp.count(fir))
mp[fir] = cnt ++;
if(!mp.count(sec))
mp[sec] = cnt ++;
vt[mp[fir]].push_back(mp[sec]);
}
DFS(0);
if(dp[0][1] > dp[0][0] && s[0][1])
printf("%d Yes\n", dp[0][1]);
else if(dp[0][1] < dp[0][0] && s[0][0])
printf("%d Yes\n", dp[0][0]);
else
printf("%d No\n", max(dp[0][0] , dp[0][1]));
}
}
POJ 3342 Party at Hali-Bula (树形dp 树的最大独立集 判多解 好题)的更多相关文章
- POJ3398Perfect Service[树形DP 树的最大独立集变形]
Perfect Service Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 1518 Accepted: 733 De ...
- 树形DP+树状数组 HDU 5877 Weak Pair
//树形DP+树状数组 HDU 5877 Weak Pair // 思路:用树状数组每次加k/a[i],每个节点ans+=Sum(a[i]) 表示每次加大于等于a[i]的值 // 这道题要离散化 #i ...
- [HDU 5293]Tree chain problem(树形dp+树链剖分)
[HDU 5293]Tree chain problem(树形dp+树链剖分) 题面 在一棵树中,给出若干条链和链的权值,求选取不相交的链使得权值和最大. 分析 考虑树形dp,dp[x]表示以x为子树 ...
- POJ 2342 &&HDU 1520 Anniversary party 树形DP 水题
一个公司的职员是分级制度的,所有员工刚好是一个树形结构,现在公司要举办一个聚会,邀请部分职员来参加. 要求: 1.为了聚会有趣,若邀请了一个职员,则该职员的直接上级(即父节点)和直接下级(即儿子节点) ...
- POJ 3162 bit区间查询最值+树形DP
POJ 3162 『题目链接』POJ 3162 『题目类型』bit区间查询最值+树形DP ✡Problem: 一棵n个节点的树.wc爱跑步,跑n天,第i天从第i个节点开始跑步,每次跑到距第i个节点最远 ...
- POJ 3162.Walking Race 树形dp 树的直径
Walking Race Time Limit: 10000MS Memory Limit: 131072K Total Submissions: 4123 Accepted: 1029 Ca ...
- POJ 1655.Balancing Act 树形dp 树的重心
Balancing Act Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14550 Accepted: 6173 De ...
- poj 2342 【Anniversary party】树形dp
题目传送门//res tp poj 题意 给出一棵有权树,求一个节点集的权值和,满足集合内的任意两点不存在边 分析 每个点有选中与不选中两种状态,对于第\(i\)个点,记选中为\(sel_i\),不选 ...
- HDU 2196.Computer 树形dp 树的直径
Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
随机推荐
- Jmeter之https请求
Jmeter之录制https脚本,网上介绍了好多种方法,大家自行百度. 如果手写https脚本,该如何做呢? 方法:http信息头管理器,加入User-Agent参数 案例:手写百度的搜索:哈哈 请 ...
- JAVA编程不得不看的几本经典书籍
为了帮助对java编程感兴趣的同学更好.更快的提高编程技术,武汉北大青鸟光谷校区专业老师在此推荐几本学习编程非常有用的书籍,以供大家参考. 入门类 1.<java从入门到精通>(第3版) ...
- CE工具里自带的学习工具--第三关
图解: 重复第5,6,7,8,9步,最终得到:
- 第3节 mapreduce高级:4、倒排索引的建立
倒排索引建立 需求分析 需求:有大量的文本(文档.网页),需要建立搜索索引 最终实现的结果就是哪个单词在哪个文章当中出现了多少次 思路分析: 首选将文档的内容全部读取出来,加上文档的名字作为key,文 ...
- python 删除/查找重复项
l = [1,2,3,2,1] # l = ['你','我','他','她','你'] for i in l: print("the %s has found %s" % (i, ...
- [Python3网络爬虫开发实战] 1.2.4-GeckoDriver的安装
上一节中,我们了解了ChromeDriver的配置方法,配置完成之后便可以用Selenium驱动Chrome浏览器来做相应网页的抓取. 那么对于Firefox来说,也可以使用同样的方式完成Seleni ...
- RNNCell使用
目录 Recap input dim, hidden dim SimpleRNNCell Single layer RNN Cell Multi-Layers RNN RNN Layer Recap ...
- 杭电 5363 求集合的非空子集中key的数量
Description soda has a set S with n integers {1,2,…,n}. A set is called key set if the sum of intege ...
- UVa Sculpture(离散化 floodfill)
题意: 给定n个立方体的一个顶点坐标和3边长度, 问这些立方体组成的雕塑的表面积和体积, 坐标都是整数,n最大为50, 最大为500, 边长最大也是500. 分析: 继UVa221后又一道离散 ...
- HASH的应用(负数下标用偏移量解决)
Input 每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个处于区间[-500000,500000]的整数. Output 对每组测试数据按从大到小的 ...