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 ...
随机推荐
- 初步了解asp.net运行机制
客户通过客户端浏览器输入url地址请求资源,服务器接收到客户端请求,首先为http请求分配应用程序池,然后在应用程序池中创建请求需要的管道,这个管道对http请求的各个步骤进行了分配. 当用户第一次请 ...
- 《HelloGitHub》第 14 期
公告 欢迎通过在 GitHub 上新建 issues 方式推荐项目,我真心希望读者可以在 HelloGItHub,找到真正的编程乐趣! <HelloGitHub>第 14 期 兴趣是最好的 ...
- 【JAVAWEB学习笔记】网上商城实战2:异步加载分类、Redis缓存分类和显示商品
网上商城实战2 今日任务 完成分类模块的功能 完成商品模块的功能 1.1 分类模块的功能: 1.1.1 查询分类的功能: 1.1.2 查询分类的代码实现: 1.1.2.1 创建 ...
- Windows 修改电脑属性(一)
修改电脑属性里的注册信息 修改电脑属性的注册信息 运行注册表的方法:开始→运行→regedit→确定 1.CPU型号可以注册表编辑器中定位到下面的位置: HKEY_LOCAL_MACHINE\HARD ...
- java设计模式之 装饰器模式
装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构. 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装 ...
- 转自52 梦回凉亭的她 Java常见问题,面试题
收集整理分享# 相关概念## 面向对象的三个特征封装,继承,多态.这个应该是人人皆知.有时候也会加上抽象.## 多态的好处允许不同类对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不 ...
- 【PHP】最详细PHP从入门到精通(三)——PHP中的数组
PHP从入门到精通 之PHP中的数组 各位开发者朋友大家好,链接上次更新,我们PHP的学习也更深了一层,本次博主给大家带来PHP数组的数组实例详解的相关资料.数组分为数组数值数值,关联数组,多维数组 ...
- Qt自定义标签按钮
当你接触到Qt时,你会为它极为方便的跨平台方面感到吃惊,从而想尝试着使用Qt.渐渐地你会发现Qt自带的一些控件不能满足自己的需要,此时就需要我们自己定义一个属于自己的控件.总所周知,标签的风格设置类比 ...
- ZooKeeper数据结构
Time in ZooKeeper ZooKeeper跟踪时间的多种方式 1)Zxid:每个ZooKeeper状态变化将会接收到一个zxid(ZooKeeper Transaction Id)的时间戳 ...
- JQuery源码阅读记录
新建html文件,在浏览器中打开文件,在控制台输入consoole.log(window);新建html文件,引入JQuery后在浏览器中打开,在控制台同样输入consoole.log(window) ...