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(树型动态规划)的更多相关文章

  1. 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 ...

  2. 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 ...

  3. POJ 2152 fire / SCU 2977 fire(树型动态规划)

    POJ 2152 fire / SCU 2977 fire(树型动态规划) Description Country Z has N cities, which are numbered from 1 ...

  4. POJ 3398 Perfect Service(树型动态规划,最小支配集)

    POJ 3398 Perfect Service(树型动态规划,最小支配集) Description A network is composed of N computers connected by ...

  5. POJ 3659 Cell Phone Network / HUST 1036 Cell Phone Network(最小支配集,树型动态规划,贪心)-动态规划做法

    POJ 3659 Cell Phone Network / HUST 1036 Cell Phone Network(最小支配集,树型动态规划,贪心) Description Farmer John ...

  6. hdu 2412 Party at Hali-Bula【树形dp】

    HDU 2412 和poj 2342(hdu 1520)差不多,多了一个判断最优解是(Yes)否(No)唯一.关键问题也在这个判断最优解是否唯一上. 先定义dp[u][2],表示选(dp[][1])或 ...

  7. POJ 2240 Arbitrage / ZOJ 1092 Arbitrage / HDU 1217 Arbitrage / SPOJ Arbitrage(图论,环)

    POJ 2240 Arbitrage / ZOJ 1092 Arbitrage / HDU 1217 Arbitrage / SPOJ Arbitrage(图论,环) Description Arbi ...

  8. 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 ...

  9. 【POJ 3140】 Contestants Division(树型dp)

    id=3140">[POJ 3140] Contestants Division(树型dp) Time Limit: 2000MS   Memory Limit: 65536K Tot ...

随机推荐

  1. JVM学习笔记三:垃圾收集器与内存分配策略

    内存回收与分配重点关注的是堆内存和方法区内存(程序计数器占用小,虚拟机栈和本地方法栈随线程有相同的生命周期). 一.判断对象是否存活? 1. 引用计数算法 优势:实现简单,效率高. 致命缺陷:无法解决 ...

  2. 纯css实现select下拉框并排显示

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. cs6安装

    [按下面步骤操作 无需序列号] ·打上补丁 永远无需序列号 (现在网上没什么能用的序列号) ·1双击CS软件安装,选择试用 ·2创建ID 输入自己邮箱和密码,姓名可以随意输入 ·3安装完成后 运行一次 ...

  4. vue2入坑随记(二) -- 自定义动态组件

    学习了Vue全家桶和一些UI基本够用了,但是用元素的方式使用组件还是不够灵活,比如我们需要通过js代码直接调用组件,而不是每次在页面上通过属性去控制组件的表现.下面讲一下如何定义动态组件. Vue.e ...

  5. 机器学习:线性判别式分析(LDA)

    1.概述      线性判别式分析(Linear Discriminant Analysis),简称为LDA.也称为Fisher线性判别(Fisher Linear Discriminant,FLD) ...

  6. 解决laydate时间日期插件定位溢出

    laydate是一款比较好用的网页时间日期插件,不过用起来有一些细节问题需要我们手动去解决!例如:laydate兼容bootstrap 1. 默认情况 laydate弹出层默认对齐input左边框 2 ...

  7. Java+XSL合并多个XML文件

    使用 Java 解析 XML 文件有许多成熟的工具,如 dom4j 等等.但在一些场景中,我们可能使用 Ant.Maven 等构建工具对多个 XML 文件进行合并,我们希望可以直接通过脚本文件,或者简 ...

  8. 一个用 js 实现点阵图的编辑器演示

    这是个客户的需求,具体大概是可以在一个 24*8 的点阵图上自由绘制图形,然后数据的存储是按列依次记录,用0和1分别表示是否选中,最终串成一个字符串. 整体需求难度并不复杂,所以在写demo的时候就尽 ...

  9. js原生获取className&多选一

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. CSS雪碧图自动生成软件

    下载地址 http://www.99css.com/1524/ 包含详细的下载地址.下载步骤以及使用教程 亮点:自动合成雪碧图+自动生成雪碧图background-position代码 简单过程 下载 ...