题意:公司有 n 个人形成一个树形结构,除了老板都有唯一的一个直系上司,要求选尽量多的人,但不能同时选一人上和他的直系上司,问最多能选多少人,并且是不是唯一的方案。

析:这个题几乎就是树的最大的独立集问题,只不过多一个判断唯一性而已。用两个数组,一个用来记录人数,一个用来判断唯一性。

d[u][0],表示以 u 为根的子树中,不选 u 点能够得到最大人数,那么d[u][1]就是选 u 点能达到最大人数。

f[u][0]类似,表示以 u 为根的子树中,不选 u 点是否唯一,那么f[u][1]就是选 u 点是否唯一。

对于d[u][1]的计算,因为选择了 u,那么 u 的子结点都不能选,所以就是 d[u][1] = sum(d[v][0], v是子结点),当f[v][0] 是不唯一时,f[u][1] 也不唯一。

对于d[u][0]的计算,因为没有选择了 u,那么它的子结点可以选也可以不选,也就是选最大的,即d[u][0] = sum(max(d[v][0], d[v][1])),那么这个唯一性怎么判断呢?和上面差不多,

就多了一个,如果d[v][0] == d[v][1],那么这个就是不唯一的了,其他的和上面一样。剩下的就简单了,用DFS即可。

代码如下:

#include <iostream>
#include <cstdio>
#include <map>
#include <cstring>
#include <vector> using namespace std;
const int maxn = 200 + 5;
vector<int> G[maxn];
bool f[maxn][2];
int d[maxn][2], n, cnt;//d[u][0] 不选 ,d[u][0] 选
map<string, int> id; void init(){//初始化
for(int i = 1; i <= n; ++i) G[i].clear();
memset(f, false, sizeof(f));
memset(d, 0, sizeof(d));
cnt = 0; id.clear();
} int getid(const string &s){//获得id
if(id.count(s)) return id[s];
return id[s] = ++cnt;
} void dfs(int u){
if(!G[u].size()){//最下端
d[u][0] = 0;
d[u][1] = 1;
return ;
} for(int i = 0; i < G[u].size(); ++i){
int son = G[u][i];
dfs(son);
d[u][1] += d[son][0];//d[u][1]的计算
if(f[son][0]) f[u][1] = true;//判断唯一性
if(d[son][0] > d[son][1]){//d[u][0]的计算
d[u][0] += d[son][0];
if(f[son][0]) f[u][0] = true;
}
else if(d[son][0] == d[son][1]){//相等,那就不唯一
d[u][0] += d[son][0];
f[u][0] = true;
}
else {
d[u][0] += d[son][1];
if(f[son][1]) f[u][0] = true;
}
}
++d[u][1];//别忘了加1
} int main(){
while(scanf("%d", &n) == 1 && n){
init();
string s1, s2;
cin >> s1; getid(s1);
for(int i = 0; i < n-1; ++i){
cin >> s1 >> s2;
G[getid(s2)].push_back(getid(s1));
} dfs(1);
if(d[1][0] == d[1][1]) printf("%d No\n", d[1][0]);//判断谁在数更大
else if(d[1][0] > d[1][1]) printf("%d %s\n", d[1][0], f[1][0] ? "No" : "Yes");
else printf("%d %s\n", d[1][1], f[1][1] ? "No" : "Yes");
}
return 0;
}

UVa 1220 Party at Hali-Bula (树形DP,最大独立集)的更多相关文章

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

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

  2. UVA - 1220 Party at Hali-Bula (树形DP)

    有 n 个员工,n-1个从属关系. 不能同时选择某个员工和他的直接上司,问最多可以选多少人,以及选法是否唯一. 树上的最大独立集问题.只不过多了一个判断唯一性. dp[u][0]表示不选这个点的状态, ...

  3. 【UVA 1380】 A Scheduling Problem (树形DP)

    A Scheduling Problem   Description There is a set of jobs, say x1, x2,..., xn <tex2html_verbatim_ ...

  4. UVA Live Archive 4015 Cave (树形dp,分组背包)

    和Heroes Of Might And Magic 相似,题目的询问是dp的一个副产物. 距离是不好表示成状态的,但是可以换一个角度想,如果知道了从一个点向子树走k个结点的最短距离, 那么就可以回答 ...

  5. UVa 1220 Hali-Bula的晚会(树的最大独立集)

    https://vjudge.net/problem/UVA-1220 题意: 公司里有n个人形成一个树状结构,即除了老板以外每个员工都有唯一的直属上司.要求选尽量多的人,但不能同时选择一个人和他的直 ...

  6. UVa 10859 - Placing Lampposts 树形DP 难度: 2

    题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

  7. UVA - 1218 Perfect Service(树形dp)

    题目链接:id=36043">UVA - 1218 Perfect Service 题意 有n台电脑.互相以无根树的方式连接,现要将当中一部分电脑作为server,且要求每台电脑必须连 ...

  8. 树形DP UVA 1292 Strategic game

    题目传送门 /* 题解:选择一个点,它相邻的点都当做被选择,问最少选择多少点将所有点都被选择 树形DP:dp[i][0/1]表示当前点选或不选,如果选,相邻的点可选可不选,取最小值 */ /***** ...

  9. uva 1292 树形dp

    UVA 1292 - Strategic game 守卫城市,城市由n个点和n-1条边组成的树,要求在点上安排士兵,守卫与点相连的边.问最少要安排多少士兵. 典型的树形dp.每一个点有两个状态: dp ...

随机推荐

  1. 使用 maven 构建 SpringMVC

    引言 最近需要使用SpringMVC做一个小项目,之前对SpringMVC没什么了解,所以先写一个SpringMVC的小Demo练习一下. 使用Maven构建项目 IDE = Eclipse 首先创建 ...

  2. Shell教程快速入门

    Shell即是一种命令语言,又是一种程序设计语言,使用者可以通过Shell访问操作系统的内核服务. Shell编程和java.python.C一样,只要一个能编写代码的文本编辑器和一个能解释执行的脚本 ...

  3. 5月16日上课笔记-js中DOM操作

    一.DOM操作 DOM节点的操作 增加 删除 修改 节点的信息: nodeName 获取节点的标签名 parentNode 获取父节点 childNodes IE忽略回车换行,chrome回车换行是文 ...

  4. 启动tomcat服务器,配置CATALINA_HOME和JAVA_HOME

    遇到很多次运行startup.bat后,一个窗口一闪而过的问题,但是从来没去纠正怎样修改配置才是正确的,现在从网上查阅的资料整理如下:tomcat在启动时,会读取环境变量的信息,需要一个CATALIN ...

  5. Nginx 服务器开启status页面检测服务状态

    一.Nginx status monitor 和apache 中服务器状态一样.输出的内容如:  第1列: 当前与http建立的连接数,包括等待的客户端连接:2 第2列: 接受的客户端连接总数目:20 ...

  6. ethereum

    几个网址 https://github.com/ethereum/go-ethereum/wikihttp://ethfans.org windows下安装以太币钱包 从下面网址下载钱包,不用安装是绿 ...

  7. javascript json数据的处理

    1.前端页面default.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...

  8. 21_java之File对象和递归遍历

    01IO技术概述 * A:IO技术概述 * a: Output * 把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作 * b: Input * 把持久设备上的数据读取到内存中的这 ...

  9. django之部署

    布署 从uwsgi.nginx.静态文件三个方面处理 服务器介绍 服务器:私有服务器.公有服务器 私有服务器:公司自己购买.自己维护,只布署自己的应用,可供公司内部或外网访问 公有服务器:集成好运营环 ...

  10. vs2012应用程序的打包和图标设置

    最近用VS2010+QT做了一个小软件,为了把它打包发布,查了很多资料,现在总结下,便于以后查看. 本方法不限于VS2010,也不限于QT,只要你运行你的代码得到exe之后,都可以参照本方法进行. 参 ...