POJ 3342 Party at Hali-Bula (树形dp 树的最大独立集 判多解 好题)
2017-05-14 08:33
441 查看
[align=center]Party at Hali-Bula[/align]
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
Sample Output
Source
Tehran 2006
题目链接: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了大半天。
。。
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 5660 | Accepted: 2022 |
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
Tehran 2006
题目链接: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 最大独立集
- POJ 3342 Party at Hali-Bula (树形dp 树的最大独立集 判多解 好题)
- POJ - 3342 - Party at Hali-Bula (树形dp + 判断唯一解)
- poj 3342 Party at Hali-Bula 树形dp
- 100道动态规划——36 UVA 1220 Party at Hali-Bula 树形DP 最大独立集 思考欠妥
- POJ - 3342 Party at Hali-Bula 树形DP
- POJ 3342 Party at Hali-Bula(树形DP)
- 【hdu 2412 Party at Hali-Bula 】(树形dp求最大独立集+判断唯一性)
- [poj 3342]Party at Hali-Bula 树形dp
- UVa - 1220 - Party at Hali-Bula ( 树形DP 求最大独立集 )
- 树形DP_____Party at Hali-Bula( POJ 3342 )
- poj 3342 Party at Hali-Bula(树形dp)
- poj 3342 Party at Hali-Bula 判断二分图最大点独立集是否唯一
- Party at Hali-Bula - POJ 3342 树形dp
- poj 3342 Party at Hali-Bula(树形DP+判断方式是不是唯一)
- POJ 3342 - Party at Hali-Bula 树形DP+最优解唯一性判断
- UVA 1220 Party at Hali-Bula (树形dp--树的最大独立集)
- UVa 1220 Party at Hali-Bula (树形DP,最大独立集)
- Party at Hali-Bula(UVA - 1220) 树形dp 最大独立集
- poj 3342 Party at Hali-Bula(树形dp)