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的晚会(树的最大独立集)的更多相关文章

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

  2. Uva 1220,Hali-Bula 的晚会

    题目链接:https://uva.onlinejudge.org/external/12/1220.pdf 题意: 公司n个人,形成一个数状结构,选出最大独立集,并且看是否是唯一解. 分析: d(i) ...

  3. UVa 1220 Party at Hali-Bula 晚会

    #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #i ...

  4. UVa 1220 - Party at Hali-Bula(树形DP)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  5. POJ 2342 树的最大独立集

    题意:在树的最大独立集的基础上,加上权值.求最大. 分析: 采用刷表的方式写记忆化,考虑一个点选和不选,返回方式pair 型. 首先,无根树转有根树,dp(root). 注意的是:u不选,那么他的子节 ...

  6. POJ 3342 Party at Hali-Bula (树形dp 树的最大独立集 判多解 好题)

    Party at Hali-Bula Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5660   Accepted: 202 ...

  7. 求树的最大独立集,最小点覆盖,最小支配集 贪心and树形dp

    目录 求树的最大独立集,最小点覆盖,最小支配集 三个定义 贪心解法 树形DP解法 (有任何问题欢迎留言或私聊&&欢迎交流讨论哦 求树的最大独立集,最小点覆盖,最小支配集 三个定义 最大 ...

  8. HDU - 1520 Anniversary party (树的最大独立集)

    Time limit :1000 ms :Memory limit :32768 kB: OS :Windows There is going to be a party to celebrate t ...

  9. UVa 1220 (树的最大独立集) Party at Hali-Bula

    题意: 有一棵树,选出尽可能多的节点是的两两节点不相邻,即每个节点和他的子节点只能选一个.求符合方案的最大节点数,并最优方案判断是否唯一. 分析: d(u, 0)表示以u为根的子树中,不选u节点能得到 ...

随机推荐

  1. CMSPRESS-PHP无限级分类

    原博文地址:http://blog.sina.com.cn/s/blog_75ad10100101mrv0.html 当你学习php无限极分类的时候,大家都觉得一个字“难”我也觉得很难,所以,现在都还 ...

  2. 解决svn log显示no author,no date的方法之一

    https://blog.csdn.net/feixiang_song/article/details/37809341 关于mac自带的svn的配置请参考该博客:点击打开链接 问题: 在linux执 ...

  3. weka数据挖掘拾遗(一)---- 生成Arff格式文件

    一.什么是arff格式文件 1.arff是Attribute-Relation File Format缩写,从英文字面也能大概看出什么意思.它是weka数据挖掘开源程序使用的一种文件模式.由于weka ...

  4. soapUI-Properties

    1.1.1  Properties 1.1.1.1 概述 - Properties Option Description   Toolbar 属性TestStep工具栏   Properties Li ...

  5. ubuntu vim python配置

    参考https://www.cnblogs.com/cjy15639731813/p/5886158.html 但是后面打开文件的时候会报错,参考https://blog.csdn.net/jeff_ ...

  6. python 的 json 转换

    python 的 json 转换 本文为原创文章,禁止转载! 本文以 json.dumps()  和 json.loads() 方法进行 Python 数据和 json 格式之间转换,进行讲解 首先比 ...

  7. 2.TypeScript 基础入门(二)

    变量类型的那些事 1.基本注解 类型注解使用:TypeAnnotation 语法.类型声明空间中可用的任何内容都可以用作类型注解. const num: number = 123; function ...

  8. discuz $_G变量

    class.core.php中 global $_G;        $_G = array(            'uid' => 0,            'username' => ...

  9. .NET 和 .NET框架概览

    什么是.NET .NET是为简化在第三代因特网的分布式环境下的应用程序的开发,基于开放互联网标准和协议之上,实现异质语言和平台高度交互性而构建的新一代计算和通信平台.其主要由三部分构成:.NET框架. ...

  10. SQL查询日历

    这东西给自己留着用. 经常会用到一些查询需要做全月统计,但有些时候的统计需要将未发生日期也显示出来,因此会需要一个固定的日期表,(T6的自定义查询估计也是需要的,至少以前是这样) 下面写两种方法来获取 ...