题意:  给定n个人,存在上下级关系,每个人只有一个上级,求最大独立集。并判断最大独立集是否唯一

思路:d[i][0]表示以i为根的子树中,不选择第i个节点的最大独立集,f[i][0]表示以i为根的子树中,不选择第i个节点的方案是否唯一。同理,d[i][1]和f[i][1]就是选择第i个节点的情况。

  状态转移:d[i][0] =

∑max(d[v][0], d[v][1]), d[i][1] =
∑d[v][0];

  唯一性的转移方程见代码:

if(k == 1) { //选择节点u
			d[u][k] += dfs(v, 0); //不选择子节点
			if(!f[v][0]) f[u][k] = 0;
		}
		else {
			d[u][k] += max(dfs(v, 1), dfs(v, 0));
			if(d[v][0] == d[v][1]) f[u][k] = 0;
			else if(d[v][0] > d[v][1] && !f[v][0]) f[u][k] = 0;
			else if(d[v][1] > d[v][0] && !f[v][1]) f[u][k] = 0;
		}



AC代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<utility>
#include<string>
#include<iostream>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<stack>
using namespace std;
#define eps 1e-10
#define inf 0x3f3f3f3f
#define PI pair<int, int>
const int maxn = 200 + 5;
map<string, int>name;
vector<int>son[maxn];
int cnt, d[maxn][2], f[maxn][2];

int getID(string &p) {
	if(!name.count(p)) name[p] = cnt++;
	return name[p];
}

int dfs(int u, int k) {
	f[u][k] = 1;
	d[u][k] = k;
	int n = son[u].size();
	for(int i = 0; i < n; ++i) {
		int v = son[u][i];
		if(k == 1) { //选择节点u
			d[u][k] += dfs(v, 0); //不选择子节点
			if(!f[v][0]) f[u][k] = 0;
		}
		else {
			d[u][k] += max(dfs(v, 1), dfs(v, 0));
			if(d[v][0] == d[v][1]) f[u][k] = 0;
			else if(d[v][0] > d[v][1] && !f[v][0]) f[u][k] = 0;
			else if(d[v][1] > d[v][0] && !f[v][1]) f[u][k] = 0;
		}
	}
	return d[u][k];
}

int main() {
	int n, root;
	string boss, kid;
	while(scanf("%d", &n) == 1 && n) {
		for(int i = 0; i < n; ++i) son[i].clear();
		name.clear();
		cnt = 0;
		cin >> boss;
		getID(boss);
		for(int i = 1; i < n; ++i) {
			cin >> kid >> boss;
			int par = getID(boss), kids = getID(kid);
			son[par].push_back(kids);
		}
		int ans = max(dfs(0, 0), dfs(0, 1));
		printf("%d ", ans);
		int only = 1;
		if(d[0][0] == d[0][1]) only = 0;
		else if(d[0][0] > d[0][1] && !f[0][0]) only = 0;
		else if(d[0][1] > d[0][0] && !f[0][1]) only = 0;
		if(only) printf("Yes\n");
		else printf("No\n");
	}

	return 0;
}

如有不当之处欢迎指出!

UVA - 1220 Party at Hali-Bula 树的最大独立集的更多相关文章

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

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

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

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

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

  4. POJ 2342 树的最大独立集

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

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

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

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

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

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

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

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

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

  9. Uva 1220,Hali-Bula 的晚会

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

随机推荐

  1. java —— equals 与 ==

    equals 众所周知,java 中的所有的类都继承自 Object 这个超类 ,他就是Java所有类的父类或祖先类,Object类里面有一个equals方法,并且提供了默认的实现,如下所示. pub ...

  2. junit设计模式--命令者模式

    命令模式的意图 将一个请求封装成一个对象,从而使你可以用不同的请求对客户进行参数化: 对请求排队或记录请求日志,以及支持可撤销的操作: 命令模式告诉我们可以为一个操作生成一个对象并给出它的一个执行方法 ...

  3. 输入和输出--java序列化机制

    对象的序列化 什么是Java对象的序列化? 对象序列化的目标是将对象保存到磁盘上,或允许在网络中直接传输对象.对象序列化机制允许把内存中的Java对象转换成与平台无关的二进制流,从而保存或者传输.其他 ...

  4. MyEclipse中设置注释模板的方法

    1.选择菜单Window→Preferences. 2.选择Java→Code style→Code Templates→Commets.选中具体的分类如Methods,点击右侧的Edit可以设置对应 ...

  5. text和submit框的border问题

    A1:在input框中,为type为text的输入框增加边框,它会在内容区域外额外增添,但是在submit框中,它会占用内容区块的一部分作为边框 <style type="text/c ...

  6. 如何更改wampserver的网站根目录

    我之前把网站根目录自定义为:D:/demo,现在想改为:D:www, 过程就是打开httpd.conf文件,搜索demo,然后把demo改为www,之后更改虚拟配置文件,记住D盘下一定要有www目录 ...

  7. Spring Cache For Redis

    一.概述 缓存(Caching)可以存储经常会用到的信息,这样每次需要的时候,这些信息都是立即可用的. 常用的缓存数据库: Redis   使用内存存储(in-memory)的非关系数据库,字符串.列 ...

  8. pwd 的“P”选项

    1.目录是链接目录时,pwd -P  显示出实际路径,而非使用连接(link)路径:pwd显示的是连接路径 例: [root@localhost soft]# cd /etc/init.d [root ...

  9. encodeURI()和encodeURIComponent()

    encodeURI() 返回值 URIstring 的副本,其中的某些字符将被十六进制的转义序列进行替换. 说明 该方法会替换所有的字符,但不包括以下字符,即使它们具有适当的UTF-8转义序列: 保留 ...

  10. linux下网卡相关查看设置

    查整机硬件信息命令dmesg 查看网卡设备相关dmesg | grep eth 查看网卡eth0信息dmesg | grep eth0 使用ethtool命令查看指定网卡信息ethtool eth0 ...