UVA1220Party at Hali-Bula(树的最大独立集 + 唯一性判断)
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=105116#problem/H
紫书P282
员工和直属老板只能选一个,最多选多少人
思路:d(u,0)表示以U为根的子树,不选u点,则子节点可选可不选,f(u,0)表示不选u的唯一性 (1表示唯一,0,表示不唯一)
d(u,1)以u为根的子树,选择u点,f(u,1)表示选择u的唯一性
转移方程:d(u,0) = sum{ max( d(v,0), d(v,1) ) },v是子节点,当d(v,0) == d(v,1) ,不唯一,或者选择的那个不唯一,则f(u,0)不唯一
d(u,1) = sum{ d(v,0) }, 当f(v,0)有一个不唯一,则不唯一
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <map>
using namespace std;
const int MAX = ;
vector <int> son[MAX];
map<string, int> name;
int d[MAX][],f[MAX][];
void DP(int u)
{
if(son[u].size() == )
{
d[u][] = f[u][] = ;
d[u][] = ;
f[u][] = ;
return;
}
int c = (int) son[u].size();
for(int i = ; i < c; i++)
{
DP(son[u][i]);
}
int sum = ,flag = ;
for(int i = ; i < c; i++)
{
sum += d[ son[u][i] ][];
if(f[ son[u][i] ][] == )
flag = ;
}
if(flag)
f[u][] = ;
else
f[u][] = ;
d[u][] = max(d[u][], sum + );
sum = ,flag = ;
for(int i = ; i < c; i++)
{
if(d[ son[u][i] ][] > d[ son[u][i] ][])
{
sum += d[ son[u][i] ][] ;
if(f[ son[u][i] ][] == )
flag = ;
}
else if(d[ son[u][i] ][] < d[ son[u][i] ][])
{
sum += d[ son[u][i] ][];
if(f[ son[u][i] ][] == )
flag = ;
}
else
{
sum += d[ son[u][i] ][];
flag = ;
}
}
if(flag)
f[u][] = ;
else
f[u][] = ;
d[u][] = max(d[u][], sum);
}
int main()
{
int n,m;
char worker[],boss[];
while(scanf("%d", &n) != EOF && n)
{
for(int i = ; i < MAX; i++)
son[i].clear();
name.clear();
memset(d, , sizeof(d));
memset(f, , sizeof(f));
m = ;
scanf("%s", boss);
name[boss] = m++;
for(int i = ; i < n; i++)
{
scanf("%s%s",worker,boss);
if(name.count(worker) == ) //注意输入的处理
name[worker] = m++;
if(name.count(boss) == )
name[boss] = m++;
son[ name[boss] ].push_back( name[worker] );
}
DP();
if(d[][] > d[][])
{
printf("%d ", d[][]);
if(f[][])
printf("Yes\n");
else
printf("No\n");
}
else if(d[][] < d[][])
{
printf("%d ", d[][]);
if(f[][])
printf("Yes\n");
else
printf("No\n");
}
else
{
printf("%d ", d[][]);
printf("No\n");
}
}
return ;
}
UVA1220Party at Hali-Bula(树的最大独立集 + 唯一性判断)的更多相关文章
- UVa 1220 Hali-Bula的晚会(树的最大独立集)
https://vjudge.net/problem/UVA-1220 题意: 公司里有n个人形成一个树状结构,即除了老板以外每个员工都有唯一的直属上司.要求选尽量多的人,但不能同时选择一个人和他的直 ...
- POJ 2342 树的最大独立集
题意:在树的最大独立集的基础上,加上权值.求最大. 分析: 采用刷表的方式写记忆化,考虑一个点选和不选,返回方式pair 型. 首先,无根树转有根树,dp(root). 注意的是:u不选,那么他的子节 ...
- POJ 3342 Party at Hali-Bula (树形dp 树的最大独立集 判多解 好题)
Party at Hali-Bula Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5660 Accepted: 202 ...
- 求树的最大独立集,最小点覆盖,最小支配集 贪心and树形dp
目录 求树的最大独立集,最小点覆盖,最小支配集 三个定义 贪心解法 树形DP解法 (有任何问题欢迎留言或私聊&&欢迎交流讨论哦 求树的最大独立集,最小点覆盖,最小支配集 三个定义 最大 ...
- HDU - 1520 Anniversary party (树的最大独立集)
Time limit :1000 ms :Memory limit :32768 kB: OS :Windows There is going to be a party to celebrate t ...
- 虚拟树研究-CheckBox初步判断只能在第一列
//虚拟树研究-CheckBox初步判断只能在第一列 procedure TWindowsXPForm.XPTreeInitNode(Sender: TBaseVirtualTree; ParentN ...
- UVA - 1220 Party at Hali-Bula 树的最大独立集
题意: 给定n个人,存在上下级关系,每个人只有一个上级,求最大独立集.并判断最大独立集是否唯一 思路:d[i][0]表示以i为根的子树中,不选择第i个节点的最大独立集,f[i][0]表示以i为根的子 ...
- UVA-1220 Party at Hali-Bula (树的最大独立集)
题目大意:数的最大独立集问题.特殊在要求回答答案是否唯一. 题目分析:定义状态dp(i,1),dp(i,0)分别表示以i为根节点的子树选不选i最多可选的人数,f(i,1),f(i,0)分别表示以i为根 ...
- UVa 1220 (树的最大独立集) Party at Hali-Bula
题意: 有一棵树,选出尽可能多的节点是的两两节点不相邻,即每个节点和他的子节点只能选一个.求符合方案的最大节点数,并最优方案判断是否唯一. 分析: d(u, 0)表示以u为根的子树中,不选u节点能得到 ...
随机推荐
- prepareStatement createStatement
preparedstatement具备很多优点,开发者可能通常都使用它,只有在完全是因为性能原因或者是在一行sql语句中没有变量的时候才使用通常的statement. preparedstatemen ...
- WP 8.1 中挂起时页面数据保存方式
1.保存到Applicaion Data配置信息中: 保存: private void testTB_TextChanged(object sender, TextChangedEventArgs e ...
- Restful是什么,SOAP Webservice和RESTful Webservice
首先,应该怀着这样一种心态来学习Restful——Restful你可以将其理解一种软件架构风格,并且诠释了Http协议的设计初衷,所以不要把他理解的那么神秘,Restful风格有好处,当然也是有坏处的 ...
- An Introduction to Interactive Programming in Python (Part 1) -- Week 2_2 练习
#Practice Exercises for Logic and Conditionals # Solve each of the practice exercises below. # 1.Wri ...
- MVC3迁移MVC4相关问题
mvc3迁移到mvc4后,发布到服务器,出现了如下错误: [A]System.Web.WebPages.Razor.Configuration.RazorPagesSection cannot be ...
- 20135220谈愈敏Linux Book_17
第17章 设备与模块 关于设备驱动和设备管理的四种内核成分: 设备类型:在所有 Unix 系统中为了统一普通设备的操作所采用的分类. 模块: Linux 内核中用于按需加载和卸载目标码的机制. 内核对 ...
- 20155224聂小益 - 我的技能与C语言学习
20155224聂小益 - 我的技能与C语言学习 预备作业2 ● 你有什么技能比大多人(超过90%以上)更好? 我认为我可能有些技能身边有的人比较少有,但是要是超过90%以上我实在不敢保证.毕竟厉害的 ...
- 点击事件touches与ios的手势UIGestureRecognizer
.h文件 @property (weak,nonatomic) IBOutlet UILabel *messageLabel;@property (weak,nonatomic) IBOutlet U ...
- MATLAB仿真总结
MATLAB仿真过程中,编写MATLAB代码的时候犯了很多错误,做了很多蠢事.记录下自己犯错的点点滴滴,并引以为戒.使用MATLAB版本为2014a,以下内容如有不当还请指正. 1. 仿真开始前清理工 ...
- Windows Phone 开发——相机功能开发
相机功能是手机区别于PC的一大功能,在做手机应用时,如果合理的利用了拍照功能,可能会给自己的应用增色很多.使用Windows Phone的相机功能,有两种方法,一种是使用PhotoCamera类来构建 ...