博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3342 Party at Hali-Bula (树形dp 树的最大独立集 判多解 好题)
阅读量:7240 次
发布时间:2019-06-29

本文共 3702 字,大约阅读时间需要 12 分钟。

Party at Hali-Bula
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

6JasonJack JasonJoe JackJill JasonJohn JackJim Jill2MingCho Ming0

Sample Output

4 Yes1 No

Source

题目链接:
题目大意:一棵树,父亲和儿子不能同一时候选入同一个集合,如今求能选集合中元素个数最多的那个集合大小。并推断解是否唯一
题目分析:求树的最大独立集的问题。好题,也用了两次dp的思想,有点类似这题的思想
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 
#include
#include
#include
#include
#include
#include
using namespace std;int const MAX = 300;int n;int dp[MAX][2];bool s[MAX][2];bool vis[MAX];vector
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
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])); }}

转载于:https://www.cnblogs.com/gavanwanggw/p/6851549.html

你可能感兴趣的文章
移植spdylay到libcurl
查看>>
Codeforces Round #447 (Div. 2) C. Marco and GCD Sequence【构造/GCD】
查看>>
求多个区间合并后区间大小的巧妙解决方法【差分】
查看>>
转载:AAC编解码概述
查看>>
POJ 3370 Halloween treats( 鸽巢原理简单题 )
查看>>
STL vector list deque区别与实现(总结)
查看>>
讨论76 怎么查一下我机器的内存?AIX环境
查看>>
001设计模式 -- 策略模式
查看>>
Java中的基本数据类型
查看>>
wordpress 插件推荐
查看>>
对于[]()+!的研究
查看>>
jquery中对于为一组标签赋予点击事件
查看>>
文档模型(JSON)使用介绍
查看>>
实验2 柱状图生成
查看>>
利用GCTA工具计算复杂性状/特征(Complex Trait)的遗传相关性(genetic correlation)...
查看>>
Python递归报错:RuntimeError: maximum recursion depth exceeded in comparison
查看>>
[Codeforces178F2]Representative Sampling
查看>>
NPOI创建Word
查看>>
Entity Framework 使用注意:Where查询条件中用到的关联实体不需要Include
查看>>
mysql因为服务器异常关机倒是启动不了 找不到mysql.sock
查看>>