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 ...
随机推荐
- Hibernate的入门使用
数据在各个层次之间流转,在流转过程中会发生数据类型转换等一系列的交互问题.java与html的交互解决方案是struts2提供的OGNL(对象导航图语言),而java与数据库之间的技术解决方案是ORM ...
- C#通过post发送接收数据流
发送数据流方法 /// <summary> /// /// </summary> /// <param name="url">目标url< ...
- 使用VS Code调试Flutter(检查用户页面)
官方提供的是Flutter Widget Inspector,详见https://flutterchina.club/inspector/ 我用的是另外一种好用的调试工具 Dart DevTools ...
- spring cloud Bug之was unable to refresh its cache! status = Cannot execute request on any known server
可能原因: 1.application.yml server: port: 10001spring: application: name: microservice-consumer-movieeur ...
- [SQL]数据分析SQL笔试题
SQL笔试题 1.请简单写出left join和join的用法区别(可举例说明): 2.求出订单表(order表)中每个客户(custid)的最近一次购买日期(要求:按custid降序排列,trans ...
- JFinal项目eclipse出现Unknown column 'createtime' in 'order clause' 的错误
JFinal项目eclipse出现Unknown column 'createtime' in 'order clause' 的错误,在本次项目中的原因是我的表中的字段信息中创建时间的字段是creat ...
- ERC20 Token
pragma solidity ^0.4.8; contract Token{ // token总量,默认会为public变量生成一个getter函数接口,名称为totalSupply(). uint ...
- galera cluster安装与配置
由于公司数据量与并发的日渐增大,普通的主从复制已无法满足要求.对比了网上PXC.galera.mysql cluster等方案,最终决定选择galera cluster. 以下为安装步骤: 1.下载g ...
- laravel学习笔记2--表单
一.Controller 1.Request 1.1.取值:input // 1.取值 echo $request->input('name'); // 2.取不到值时打印默认值 echo $r ...
- js 弹幕效果
<!DOCTYPE HTML><html><head><meta charset="utf-8"><title>弹幕&l ...