UVA - 1220 Party at Hali-Bula 树的最大独立集
题意: 给定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 树的最大独立集的更多相关文章
- UVa 1220 Hali-Bula的晚会(树的最大独立集)
https://vjudge.net/problem/UVA-1220 题意: 公司里有n个人形成一个树状结构,即除了老板以外每个员工都有唯一的直属上司.要求选尽量多的人,但不能同时选择一个人和他的直 ...
- 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 - 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节点能得到 ...
- Uva 1220,Hali-Bula 的晚会
题目链接:https://uva.onlinejudge.org/external/12/1220.pdf 题意: 公司n个人,形成一个数状结构,选出最大独立集,并且看是否是唯一解. 分析: d(i) ...
随机推荐
- 对datatable操作经验-排序和分页
1.datatable排序1: public DataTable SortDesc(DataTable dt){ DataView dv = new DataView(); dv.Table = dt ...
- Node-debug方法
本文使用配置node-inspector配合chorme完成debug(编辑器使用SublimeText3). 1.用命令行进入安装node的目录,使用npm install -g node-insp ...
- Java - 双冒泡法排序
最开始的代码 我采用的是我原来进行快速排序所用的方法,一直做不出来. 为什么我会采用原来快速排序的方法?因为我的记忆中好像就是这样的,因此我根据记忆中的快速排序在进行改变,然而,却无法真正的写出双冒泡 ...
- 在windows环境下更改某软件的窗口位置
#include<stdio.h>#include <stdlib.h>#include <Windows.h>#include <time.h> vo ...
- mongodb查询操作分析
背景 mongodb 提供了类sql的数据查询及操作方式,同时也包含了聚合操作.索引等多个机制: 按以往的经验,不当的库表操作或索引模式往往会造成许多问题,如查询操作缓慢.数据库吞吐量低下.CPU或磁 ...
- 安装RRDtool 1.4.5
安装rrdtoolRrdtool安装需要cairo.libxml2.pango库支持,可通过yum安装安装libart_lgpl-devel这个包yum -y install libart_lgpl- ...
- Jquery DataTable控制显示列,导出EXCEL
1.初始化 var table = $('#table').DataTable({ "data": data[0].DATA, "columns": data[ ...
- 转换number为千分位计数形式js
JS实现转换千分位计数 350000.00-------350,000.00 var num=0;function format (num) { return (num.toFixed(2) + '' ...
- CAS基础和原子类
基于CAS实现的AtomicInteger. AtomicLong. AtomicReference. AtomicBoolean也被称为乐观锁. CAS的语义是“我认为V的值应该为A,如果是,那么将 ...
- bzoj 4827: [Hnoi2017]礼物 [fft]
4827: [Hnoi2017]礼物 题意:略 以前做的了 化一化式子就是一个卷积和一些常数项 我记着确定调整值还要求一下导... #include <iostream> #include ...