UVa 1220 Hali-Bula的晚会(树的最大独立集)
https://vjudge.net/problem/UVA-1220
题意:
公司里有n个人形成一个树状结构,即除了老板以外每个员工都有唯一的直属上司。要求选尽量多的人,但不能同时选择一个人和他的直属上司。输出最多能选多少人并判断是否唯一。
思路:
树的最大独立集问题。就是需要额外判定是否是唯一的。
因为输入的都是人名,所以首先就是用map容器来处理,上下属的关系就用vector容器来处理。
d[u][1]表示以u为根的子树中,选u点能得到的最大人数,f[u][1]判断这种方案是否唯一。
d[u][0]表示以u为根的子树中,不选u点能得到的最大人数,f[u][0]判断这种方案是否唯一。
状态转移方程其实不是很难。首先分析d[u][1],因为u选了,所以u的子结点都不能选,它的子节点的状态只能是这样的,所以此时d[u][1]=sum(d[v][0]|v是u的子节点)。容易想到f[v][0]都为唯一时,f[u][1]才是唯一的。
其次是d[u][0],此时u的子节点可选可不选,所以我们需要挑选出更大的那个,每个子节点都是这样处理,最后像上面那样加起来就可以了。转移方程就是d[u][0]=sum(max(d[v][0],d[v][1]))。方案唯一值的判定和上面是一样的,就是分析你所挑选的更大的那个。
根结点值依赖于子节点,所以需要用DFS来处理。
#include<iostream>
#include<string>
#include<cstring>
#include<vector>
#include<algorithm>
#include<map>
using namespace std; const int maxn = +; int n, cnt;
string s1, s2; int d[maxn][], f[maxn][]; map<string, int> id;
vector<int> sons[maxn]; void solve(int u)
{
//最下属的只有两种情况
if (sons[u].size() == )
{
d[u][] = ;
d[u][] = ;
return;
}
int k = sons[u].size(); for (int i = ; i < k; i++)
{
int son = sons[u][i];
//树形的DFS
solve(son);
d[u][] += d[son][];
//一旦有子节点不唯一,它也不唯一
if (!f[son][]) f[u][] = ;
//u不选时,它的子节点可选可不选,此时需要选个大的
d[u][] += max(d[son][], d[son][]); //判断是否唯一
if (d[son][]>d[son][] && !f[son][]) f[u][] = ;
else if (d[son][] > d[son][] && !f[son][] ) f[u][] = ;
else if (d[son][] == d[son][]) f[u][] = ; }
++d[u][];
} int main()
{
//freopen("D:\\txt.txt", "r", stdin);
while (cin >> n && n)
{
memset(d, , sizeof(d));
//初始化都为唯一
for (int i = ; i <= n; i++)
f[i][] = f[i][] = ;
id.clear();
for (int i = ; i <= n; i++)
sons[i].clear();
cnt = ; cin >> s1;
id[s1] = ++cnt;
for (int i = ; i < n; i++)
{
cin >> s1 >> s2;
if (!id[s1]) id[s1] = ++cnt;
if (!id[s2]) id[s2] = ++cnt;
sons[id[s2]].push_back(id[s1]);
} solve(); if (d[][] == d[][]) printf("%d No\n", d[][]);
else if (d[][] > d[][]) printf("%d %s\n", d[][], !f[][] ? "No" : "Yes");
else printf("%d %s\n", d[][], !f[][] ? "No" : "Yes");
}
return ;
}
UVa 1220 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(树型动态规划)
POJ 3342 Party at Hali-Bula / HDU 2412 Party at Hali-Bula / UVAlive 3794 Party at Hali-Bula / UVA 12 ...
- Uva 1220,Hali-Bula 的晚会
题目链接:https://uva.onlinejudge.org/external/12/1220.pdf 题意: 公司n个人,形成一个数状结构,选出最大独立集,并且看是否是唯一解. 分析: d(i) ...
- UVa 1220 Party at Hali-Bula 晚会
#include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #i ...
- UVa 1220 - Party at Hali-Bula(树形DP)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- 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 ...
- UVa 1220 (树的最大独立集) Party at Hali-Bula
题意: 有一棵树,选出尽可能多的节点是的两两节点不相邻,即每个节点和他的子节点只能选一个.求符合方案的最大节点数,并最优方案判断是否唯一. 分析: d(u, 0)表示以u为根的子树中,不选u节点能得到 ...
随机推荐
- OC导航栏跳转指定界面
方法一: [self.navigationController popToViewController:[self.navigationController.viewControllers objec ...
- 8 jmeter之集合点
集合点:集合点用以同步虚拟用户,以便恰好在同一时刻执行任务.在测试计划中,可能会要求系统能够承受1000 人同时提交数据,在LoadRunner 中可以通过在提交数据操作前面加入集合点,这样当虚拟用户 ...
- Java多线程面试、笔试方向---后续补充
1.ThreadLocal类 线程级别的局部变量,为每个使用该变量的线程提供一个独立的变量副本,每个线程修改副本时不影响其他线程对象的副本. ThreadLocal实例通常作为静态私有字段出 ...
- js-jquery-Validate校验【一】
一.导入 js 库 <script src="http://static.runoob.com/assets/jquery-validation-1.14.0/lib/jquery.j ...
- 混淆矩阵在Matlab中PRtools模式识别工具箱的应用
声明:本文用到的代码均来自于PRTools(http://www.prtools.org)模式识别工具箱,并以matlab软件进行实验. 混淆矩阵是模式识别中的常用工具,在PRTools工具箱中有直接 ...
- [LeetCode] 832. Flipping an Image_Easy
Given a binary matrix A, we want to flip the image horizontally, then invert it, and return the resu ...
- [LeetCode] 821. Shortest Distance to a Character_Easy tag: BFS
Given a string S and a character C, return an array of integers representing the shortest distance f ...
- xcode6 新建项目真机调试无法全屏
设置app ICons and Launch Images属性 通过设置启动图片,选择一张适配的图片(Default-568@2x)作为启动页的图片,可以解决全屏的问题
- 把 ElasticSearch 当成是 NoSQL 数据库
Elasticsearch 可以被当成一个 “NoSQL”-数据库来使用么? NoSQL 意味着在不同的环境下存在不同的东西, 而erestingly 它并不是真的跟 SQL 有啥关系. 我们开始只会 ...
- 后台维护常用SQL
OU.库存组织与子库存 select hou.organization_id ou_org_id, --org_id hou.name ou_name, --ou名称 ood.organization ...