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 1220 Party at Hali-Bula(树型动态规划)
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
Http
POJ:https://vjudge.net/problem/POJ-3342
HDU:https://vjudge.net/problem/HDU-2412
UVAlive:https://vjudge.net/problem/UVALive-3794
UVA:https://vjudge.net/problem/UVA-1220
Source
树形动态规划
题目大意
在一棵树上选取若干个点,使得没有任意两个点相邻且点权值和最大,并问最大的方案数是否唯一。
解决思路
这题和POJ2342其实是差不多的,只是增加了一个要判断是否唯一。那么关于本题的基本框架请到这里来看,本文着重讲一下如何判断唯一性。
我们知道对于一个点i和其儿子节点j来说,F[i][0]=sum(max(F[j][1],F[j][0])) ,F[i][1]=sum(F[j][0])+Value[i](上题已经说过啦),那么我们只要再加一个bool数组来存放方案是否唯一就可以啦。
我们定义Unique[i]为判断是否唯一的数组,0表示不唯一,1表示唯一;Unique[i][0]表示不选i时的唯一性,Unique[i][1]表示选i时的唯一性。
首先来看Unique[i][1]。我们知道F[i][1]=sum(F[j][0]),也就是说i只要有任意一颗子树不唯一,i就不唯一,所以有if (Unique[j][0]==0) Unique[i][1]=0;
再来看Unique[i][0]。因为F[i][0]=sum(max(F[j][0],F[j][1])),所以Unique[i][0]应该与F[j][0],F[j][1]中大的的Unique有关。
最后要注意的是,F[j][0]是可能为0的,也就是说没有选节点(这在叶子结点的上一层节点会出现),这个时候对于Unique[j][0]的讨论是无意义的(没有点怎么会有不同的方案呢),所以要跳过(楼主在这里WA了好多次)。更多细节请参看代码
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<algorithm>
#include<string>
#include<map>
using namespace std;
const int maxN=300;
const int inf=2147483647;
int n;
int F[maxN][5];
vector<int> E[maxN];
bool Unique[maxN][5];
map<string,int> Map;//因为输入的是字符串,所以我们用一个Map将其转换成数字编号
void dfs(int u);
int main()
{
while (cin>>n)
{
if (n==0)
break;
memset(F,0,sizeof(F));
memset(Unique,0,sizeof(Unique));
for (int i=1;i<=n;i++)
E[i].clear();
Map.clear();
string u,v;
int cnt=0;
cin>>u;
cnt++;
Map[u]=cnt;
int Boss=cnt;
for (int i=1;i<n;i++)//输入字符串并分配编号
{
cin>>u>>v;
if (Map[u]==0)
Map[u]=++cnt;
if (Map[v]==0)
Map[v]=++cnt;
E[Map[v]].push_back(Map[u]);
//In[Map[u]]++;
}
dfs(Boss);
bool ok;
cout<<max(F[Boss][1],F[Boss][0])<<' ';
if (F[Boss][1]==F[Boss][0])
ok=0;
else
if (F[Boss][1]>F[Boss][0])
ok=Unique[Boss][1];
else
ok=Unique[Boss][0];
if (ok)
{
cout<<"Yes"<<endl;
}
else
cout<<"No"<<endl;
/*for (int i=1;i<=n;i++)
cout<<F[i][0]<<' '<<F[i][1]<<endl;
cout<<endl;
for (int i=1;i<=n;i++)
cout<<Unique[i][0]<<' '<<Unique[i][1]<<endl;*/
}
return 0;
}
void dfs(int u)
{
Unique[u][1]=Unique[u][0]=1;//唯一性先置为唯一
for (int i=0;i<E[u].size();i++)
{
int v=E[u][i];
dfs(v);
if ((Unique[v][0]==0)&&(F[v][0]!=0))//注意这里一定要有F[v][0]!=0这一句,因为若不加的话那些没有选择任何节点的方案也会统计进去,造成出错
Unique[u][1]=0;
F[u][1]+=F[v][0];
//F[u][0]+=max(F[v][0],F[v][1]);
if (F[v][0]>F[v][1])
{
F[u][0]+=F[v][0];
if (Unique[v][0]==0)
Unique[u][0]=0;
}
else
if (F[v][0]<F[v][1])
{
F[u][0]+=F[v][1];
if (Unique[v][1]==0)
Unique[u][0]=0;
}
else if (F[v]!=0)//这里的F[v]!=0也必须有!否则会出现和上面一样的情况
{
F[u][0]+=F[v][0];
Unique[u][0]=0;
}
}
F[u][1]++;
return;
}
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 2342 Anniversary party / HDU 1520 Anniversary party / URAL 1039 Anniversary party(树型动态规划)
POJ 2342 Anniversary party / HDU 1520 Anniversary party / URAL 1039 Anniversary party(树型动态规划) Descri ...
- POJ 1087 A Plug for UNIX / HDU 1526 A Plug for UNIX / ZOJ 1157 A Plug for UNIX / UVA 753 A Plug for UNIX / UVAlive 5418 A Plug for UNIX / SCU 1671 A Plug for UNIX (网络流)
POJ 1087 A Plug for UNIX / HDU 1526 A Plug for UNIX / ZOJ 1157 A Plug for UNIX / UVA 753 A Plug for ...
- POJ 2152 fire / SCU 2977 fire(树型动态规划)
POJ 2152 fire / SCU 2977 fire(树型动态规划) Description Country Z has N cities, which are numbered from 1 ...
- POJ 3398 Perfect Service(树型动态规划,最小支配集)
POJ 3398 Perfect Service(树型动态规划,最小支配集) Description A network is composed of N computers connected by ...
- POJ 3659 Cell Phone Network / HUST 1036 Cell Phone Network(最小支配集,树型动态规划,贪心)-动态规划做法
POJ 3659 Cell Phone Network / HUST 1036 Cell Phone Network(最小支配集,树型动态规划,贪心) Description Farmer John ...
- hdu 2412 Party at Hali-Bula【树形dp】
HDU 2412 和poj 2342(hdu 1520)差不多,多了一个判断最优解是(Yes)否(No)唯一.关键问题也在这个判断最优解是否唯一上. 先定义dp[u][2],表示选(dp[][1])或 ...
- POJ 2240 Arbitrage / ZOJ 1092 Arbitrage / HDU 1217 Arbitrage / SPOJ Arbitrage(图论,环)
POJ 2240 Arbitrage / ZOJ 1092 Arbitrage / HDU 1217 Arbitrage / SPOJ Arbitrage(图论,环) Description Arbi ...
- POJ 2296 Map Labeler / ZOJ 2493 Map Labeler / HIT 2369 Map Labeler / UVAlive 2973 Map Labeler(2-sat 二分)
POJ 2296 Map Labeler / ZOJ 2493 Map Labeler / HIT 2369 Map Labeler / UVAlive 2973 Map Labeler(2-sat ...
- 【POJ 3140】 Contestants Division(树型dp)
id=3140">[POJ 3140] Contestants Division(树型dp) Time Limit: 2000MS Memory Limit: 65536K Tot ...
随机推荐
- .net开源权限管理系统
有业务请加QQ 245747009 源码地址:http://git.oschina.net/sunzewei/EIP 一.更新记录1.更新日期:2017-02-24 00:00:002.更新内容: 版 ...
- 侯捷STL学习(四)--allocator和容器时间的实现关系
第十一节 分配器 分配器的好坏影响到容器的性能 operator new()里面调用malloc D:\Program Files (x86)\Microsoft Visual Studio 12.0 ...
- (转)导出EXCEL时科学计数法问题
//1) 文本:vnd.ms-excel.numberformat:@ //2) 日期:vnd.ms-excel.numberformat:yyyy/mm/dd //3) 数字:vnd.ms-e ...
- 整理一些提高C#编程性能的技巧
1.使用StringBuilder代替使用string 连接符 "+" 说明:String类对象是不可变的(只读),一旦创建该对象,就不能修改该对象的值. 对象String对象的重 ...
- sed的用法
1.什么是sed sed命令是一个流线式.非交互式编辑器,可以实现在vi等编辑器中一样的编辑效果. 2.sed的工作原理 模式空间(pattern space) sed一次处理一行文本(或输入), ...
- elasticSearch(5.3.0)的评分机制的研究
1. ElasticSearch的评分 在用ElasticSearch作为搜索引擎的时候,如果采用关键字进行查询,ElasticSearch会对每个符合查询条件的文档进行评分,在5.3.0的版本中, ...
- Laravel踩坑笔记——illuminate/html被抛弃
起因 在使用如下代码的时候发生报错 {!! Form::open() !!} 错误信息 [Symfony\Component\Debug\Exception\FatalErrorException] ...
- Volley源码分析一
Volley源码分析 虽然在2017年,volley已经是一个逐渐被淘汰的框架,但其代码短小精悍,网络架构设计巧妙,还是有很多值得学习的地方. 第一篇文章,分析了请求队列的代码,请求队列也是我们使用V ...
- 编译安装nginx却requires the PCRE library
编译安装nginx需要pcre包,未安装会有如下提示: ./configure: error: the HTTP rewrite module requires the PCRE library. Y ...
- WPF的一些感悟
第一天在博客园写东西,只写一些自己对WPF稚嫩的理解和感悟. 1.Code Snippet代码简写工具 可以创建自己的代码模板管理器——>>>工具菜单,代码片段管理器 考出现有的+更 ...