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节点能得到 ...
随机推荐
- Sublime Text2 新建文件快速生成Html头部信息和炫酷的代码补全
预备:安装emmet插件(previously known as Zen Coding) 方法一 package control法: 上一篇博客已经介绍了如何安装package control.打开 ...
- viewmodel
[ExtJS5学习笔记]第十节 Extjs5新增特性之ViewModel和DataBinding 2015-05-29 96 本文地址:http://blog.csdn.net/susheng ...
- beanFactoory介绍
- f2fs源码分析之文件读写过程
本篇包括三个部分:1)f2fs 文件表示方法: 2)NAT详细介绍:3)f2fs文件读写过程:4) 下面详细阐述f2fs读写的过程. 管理数据位置关键的数据结构是node,node包括三种:inode ...
- WPF在XAML中Binding使用StringFormat属性
1. 绑定Currency, 如果没有字符的话, =后面需要先加入{}. 不加的话会出问题. 1 <TextBlock Text="{Binding Amount, StringFor ...
- 继续Wcf记录点滴
之前说wcf以tcp协议作为通信方式的话会出现很多奇怪的bug,今天我把自己遇到的比较特殊的一个exception和解决方案列出来.主要是自己记录一下,顺便方便遇到这个问题的有缘人吧!废话不多说直接上 ...
- C#中的默认访问修饰符
1.命名空间下的元素的默认访问修饰符 public : 同一程序集的其他任何代码或引用该程序集的其他程序集都可以访问该类型或成员.internal : 同一程序集中的任何代码都可以访问该类型或成员,但 ...
- windows命令行
[drive:] Change the current driver, without changing its current directory cd [drive:] [path] Just c ...
- Jmeter测试webocket协议
Jmeter本身不支持websocket协议的,所以需要安装第三方的插件还有6个依赖包. 首先,我们需要准备Jmeter的WebSocket协议的支持插件: JMeterWebSocketSample ...
- CUDA编程学习(一)
/****c code****/ #include<stdio.h> int main() { printf("Hello world!\n); ; } /****CUDA co ...