1. 题目描述
公司里有$n, n \in [1, 200]$个人,他们间的关系构成树状结构。除老板外,每个员工都有唯一一个直属上司,要求从中选择尽量多的人,但是不能同时选择员工和他的直属上司,问最多能选多少人,以及可行解是否是唯一的?

2. 基本思路
这显然又是一个树形DP的题目,经典模型——树的最大独立集。《算法竞赛入门经典》中的典型例题,唯一稍微不同的是需要判断可行解是否唯一。因此,先分析状态:
(1) $dp[u][0]$表示不选$u$的最大人数,$f[u][0]$表示当前选择是否唯一,此时可以选择、也可以不选择$u$的下属;
(2) $dp[u][1]$表示选择$u$的最大人数,$f[u][1]$表示当前选择是否唯一,此时一定不能选择$u$的下属;
可以很容易推导状态转移方程:
\begin{align}
    dp[u][0] &= \sum \max (dp[v][0], dp[v][1])  \\
    f[u][0]  &=  \bigwedge \Big( (dp[v][0] \neq dp[v][1]) \wedge f[v][dp[v][0] < dp[v][1]] \Big) \\
    dp[u][1] &= \sum dp[v][0]   \\
    f[u][1]  &= \bigwedge f[v][0]
\end{align}
可以使用刷表法进行实现这个DP,经典的树形DP模型。

3. 代码

  1. /* uva1220 */
  2. #include <iostream>
  3. #include <sstream>
  4. #include <string>
  5. #include <map>
  6. #include <queue>
  7. #include <set>
  8. #include <stack>
  9. #include <vector>
  10. #include <deque>
  11. #include <bitset>
  12. #include <algorithm>
  13. #include <cstdio>
  14. #include <cmath>
  15. #include <ctime>
  16. #include <cstring>
  17. #include <climits>
  18. #include <cctype>
  19. #include <cassert>
  20. #include <functional>
  21. #include <iterator>
  22. #include <iomanip>
  23. #include <tr1/unordered_map>
  24. using namespace std;
  25. //#pragma comment(linker,"/STACK:102400000,1024000")
  26.  
  27. #define sti set<int>
  28. #define stpii set<pair<int, int> >
  29. #define mpii map<int,int>
  30. #define vi vector<int>
  31. #define pii pair<int,int>
  32. #define vpii vector<pair<int,int> >
  33. #define rep(i, a, n) for (int i=a;i<n;++i)
  34. #define per(i, a, n) for (int i=n-1;i>=a;--i)
  35. #define clr clear
  36. #define pb push_back
  37. #define mp make_pair
  38. #define fir first
  39. #define sec second
  40. #define all(x) (x).begin(),(x).end()
  41. #define SZ(x) ((int)(x).size())
  42. #define lson l, mid, rt<<1
  43. #define rson mid+1, r, rt<<1|1
  44. #define INF 0x3f3f3f3f
  45. #define mset(a, val) memset(a, (val), sizeof(a))
  46.  
  47. const int maxn = ;
  48. vi E[maxn];
  49. int fa[maxn];
  50. int dp[maxn][];
  51. bool f[maxn][];
  52. int n;
  53. int pid;
  54. map<string,int> tb;
  55. map<string,int>::iterator iter;
  56.  
  57. void init() {
  58. rep(i, , n+) {
  59. E[i].clr();
  60. fa[i] = ;
  61. }
  62. tb.clr();
  63. pid = ;
  64. memset(dp, , sizeof(dp));
  65. memset(f, true, sizeof(f));
  66. }
  67.  
  68. inline void addEdge(int u, int v) {
  69. fa[v] = u;
  70. E[u].pb(v);
  71. }
  72.  
  73. inline int findId(const string& s) {
  74. int ret;
  75.  
  76. iter = tb.find(s);
  77. if (iter == tb.end()) {
  78. tb[s] = ret = pid++;
  79. } else {
  80. ret = iter->sec;
  81. }
  82.  
  83. return ret;
  84. }
  85.  
  86. void dfs(int u) {
  87. int sz = SZ(E[u]), v;
  88.  
  89. dp[u][] = ;
  90. rep(i, , sz) {
  91. v = E[u][i];
  92. dfs(v);
  93. }
  94.  
  95. // choose fa[u] choose u
  96. dp[fa[u]][] += dp[u][];
  97. f[fa[u]][] &= f[u][];
  98.  
  99. // not choose fa[u], choose or not u
  100. dp[fa[u]][] += max(dp[u][], dp[u][]);
  101. f[fa[u]][] &= (dp[u][]!=dp[u][]) & (f[u][dp[u][]<dp[u][]]);
  102. }
  103.  
  104. void solve() {
  105. dfs();
  106.  
  107. if (dp[][] > dp[][])
  108. printf("%d %s\n", dp[][], f[][]?"Yes":"No");
  109. else if (dp[][] < dp[][])
  110. printf("%d %s\n", dp[][], f[][]?"Yes":"No");
  111. else
  112. printf("%d No\n", dp[][]);
  113. }
  114.  
  115. int main() {
  116. ios::sync_with_stdio(false);
  117. #ifndef ONLINE_JUDGE
  118. freopen("data.in", "r", stdin);
  119. freopen("data.out", "w", stdout);
  120. #endif
  121.  
  122. string su, sv;
  123. int uid, vid;
  124.  
  125. while (cin>>n && n) {
  126. init();
  127. cin >> su;
  128. findId(su);
  129. rep(i, , n) {
  130. cin >> sv >> su;
  131.  
  132. uid = findId(su);
  133. vid = findId(sv);
  134. addEdge(uid, vid);
  135. }
  136. solve();
  137. }
  138.  
  139. #ifndef ONLINE_JUDGE
  140. printf("time = %ldms.\n", clock());
  141. #endif
  142.  
  143. return ;
  144. }

【uva】1220 Party at Hali-Bula的更多相关文章

  1. CJOJ 1070 【Uva】嵌套矩形(动态规划 图论)

    CJOJ 1070 [Uva]嵌套矩形(动态规划 图论) Description 有 n 个矩形,每个矩形可以用两个整数 a, b 描述,表示它的长和宽.矩形 X(a, b) 可以嵌套在矩形 Y(c, ...

  2. CJOJ 1071 【Uva】硬币问题(动态规划)

    CJOJ 1071 [Uva]硬币问题(动态规划) Description 有n种硬币,面值分别为v1, v2, ..., vn,每种都有无限多.给定非负整数S,可以选用多少个硬币,使得面值之和恰好为 ...

  3. 题解 【Uva】硬币问题

    [Uva]硬币问题 Description 有n种硬币,面值分别为v1, v2, ..., vn,每种都有无限多.给定非负整数S,可以选用多少个硬币,使得面值之和恰好为S?输出硬币数目的最小值和最大值 ...

  4. 【UVa】11270 Tiling Dominoes

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  5. 【UVA】【10828】随机程序

    数学期望/高斯消元/马尔可夫过程 刘汝佳老师白书上的例题- -b 本体不满足拓扑关系,但马尔可夫过程是可以高斯消元解的…… 用「高斯·约当消元」更方便! //UVA 10828 #include< ...

  6. 【UVA】【11762】Race to 1(得到1)

    数学期望/马尔可夫过程 DP/记忆化搜索 刘汝佳老师白书上的例题…… //UVA 11762 #include<vector> #include<cstdio> #includ ...

  7. 【UVA】【11427】玩纸牌

    数学期望 也是刘汝佳老师白书上的例题……感觉思路很神奇啊 //UVA 11427 #include<cmath> #include<cstdio> #include<cs ...

  8. 【UVA】【11021】麻球繁衍

    数序期望 刘汝佳老师的白书上的例题……参见白书 //UVA 11021 #include<cmath> #include<cstdio> #define rep(i,n) fo ...

  9. 【UVa】Headmaster's Headache(状压dp)

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

随机推荐

  1. 【CTSC 2015】&【APIO 2015】酱油记

    蒟蒻有幸参加了神犇云集的CTSC & APIO 2015,感觉真是被虐成傻逼了……这几天一直没更新博客,今天就来补一下吧~~(不过不是题解……) Day 0 从太原到北京现在坐高铁只需3小时= ...

  2. 【BZOJ】【1049】【HAOI2006】数字序列

    DP 第一问比较水……a[i]-=i 以后就变成最长不下降子序列问题了,第二问这个结论好神奇,考试的时候怎么破?大胆猜想,不用证明?TAT 题解:http://pan.baidu.com/share/ ...

  3. windows 7 下快速搭建php环境 windows7+IIS7+php

    1.       安装IIS v7.0 控制面板-程序和功能-打开或关闭Windows 功能 测试是否成功安装IIS v7.0,在浏览器输入:http://localhost/ 或者http://12 ...

  4. C编译错误解决方法

    1.expected identifier before numeric constant 一般情况下是枚举类型中的某个变量已经被#define定义过一次了,在项目空间中搜索你枚举类型中的所有变量类型 ...

  5. svg琐碎01

    svg中的<g>主要用来做分组的定位,使用transform="translate(xOffset,yOffset)" 更改起始坐标. transform中的坐标是相对 ...

  6. 从浏览器的console获取angularjs的scope

    http://ionicframework.com/blog/angularjs-console/ 1: Access Scopes We can access any scope (even iso ...

  7. hadoop1.2.1配置文件

    1)core-site.xml <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" ...

  8. ASP.NET MVC 应用提速的十种方法

    [编者按]本文作者为 DZone 社区的最具价值博主(MVB) Jonathan Danylko,主要介绍为 ASP.NET MVC 应用提速的十种方法.由国内 ITOM 管理平台 OneAPM 编译 ...

  9. 如何使用 OneAPM 监控微软 Azure Cloud Service ?

    不知不觉微软 Azure 已经进入中国市场近两年的时间.那么 Azure 平台的性能究竟如何?资源加载的延迟.虚拟机的稳定性等问题是否切实满足客户期许.这些都是大家对微软 Azure 这个国外的云服务 ...

  10. 用 VIPER 构建 iOS 应用架构(2)

    [编者按]本篇文章由 Jeff Gilbert 和 Conrad Stoll 共同编写,通过构建一个基础示例应用,深入了解 VIPER,并从视图.交互器等多个部件理清 VIPER 的整体布局及思路.通 ...