求一棵数的最大独立集结点个数并判断方案是否唯一。

dp[i][j]表示以i为根的子树的最大独立集,j的取值为选和不选。

决策:

当选择i时,就不能选择它的子结点。

当不选i时,它的子结点可选可不选。

判断唯一性:当选择的某个子节点方案不唯一,父节点的方案就不唯一,或者某个子节点选或不选方案数一样。

转移顺序:按照拓扑序转移或dfs都可以。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = ;
  4. const int pick = ;
  5. const int drop = ;
  6.  
  7. int d[maxn][];
  8. bool f[maxn][];// NotUnique?
  9. int fa[maxn];
  10. int deg[maxn];
  11. int n;
  12.  
  13. void topo()
  14. {
  15. queue<int> q;
  16. for(int i = ; i < n; i++){
  17. d[i][pick] = ;
  18. d[i][drop] = ;
  19. f[i][pick] = f[i][drop] = ;
  20. if(deg[i] == ){
  21. q.push(i);
  22. }
  23. }
  24.  
  25. while(q.size()){
  26. int u = q.front(); q.pop();
  27. int p = fa[u];
  28. int &a = d[u][drop], &b = d[u][pick];
  29. d[p][pick] += a;
  30. f[p][pick] |= f[u][drop];
  31. if(a>b){
  32. d[p][drop] += a;
  33. f[p][drop] |= f[u][drop];
  34. }else {
  35. d[p][drop] += b;
  36. f[p][drop] |= a == b || f[u][pick];
  37. }
  38. deg[p]--;
  39. if(deg[p] == ) {
  40. q.push(p);
  41. }
  42. }
  43. }
  44.  
  45. #define MP make_pair
  46. #define PB push_back
  47. #define fi first
  48. #define se second
  49. map<string,int> idx;
  50. int idx_cnt;
  51. int ID(string &x)
  52. {
  53. map<string,int>::iterator it = idx.find(x);
  54. if(it != idx.end()) return it->se;
  55. idx.insert(MP(x,idx_cnt));
  56. return idx_cnt++;
  57. }
  58.  
  59. string name;
  60. const int root = ;
  61. bool read()
  62. {
  63. scanf("%d",&n);
  64. if(n == ) return false;
  65. idx.clear();
  66. cin>>name;
  67. idx.insert(MP(name,root));
  68.  
  69. idx_cnt = ;
  70. fill(deg,deg+n,);
  71. for(int i = ; i < n; i++){
  72. cin>>name;
  73. int v = ID(name);
  74. cin>>name;
  75. int p = ID(name);
  76. fa[v] = p;
  77. deg[p]++;
  78. }
  79. return true;
  80. }
  81.  
  82. int main()
  83. {
  84. //freopen("in.txt","r",stdin);
  85. fa[root] = -;
  86. while(read()){
  87. topo();
  88. int k = d[root][pick]>d[root][drop]?pick:drop;
  89. bool flag = d[root][k] != d[root][k^] && !f[root][k];
  90. printf("%d ",d[root][k]);
  91. if(flag) puts("Yes");
  92. else puts("No");
  93. }
  94. return ;
  95. }

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 个人形成一个树形结构,除了老板都有唯一的一个直系上司,要求选尽量多的人,但不能同时选一人上和他的直系上司,问最多能选多少人,并且是不是唯一的方案. 析:这个题几乎就是树的最大的独立集 ...

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

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

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

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

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

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

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

  10. UVA 1484 - Alice and Bob&#39;s Trip(树形DP)

    题目链接:1484 - Alice and Bob's Trip 题意:BOB和ALICE这对狗男女在一颗树上走,BOB先走,BOB要尽量使得总路径权和大,ALICE要小,可是有个条件,就是路径权值总 ...

随机推荐

  1. 创建Sitemap文件供搜索引擎使用

    以下内容转载自 http://www.cnblogs.com/webtrados/archive/2009/12/29/1635305.html 如何创建Sitemap文件 Sitemap的格式有XM ...

  2. SqlServer2012——快照

    1.数据库快照 优点: 维护历史数据以生成报表.由于数据库快照可提供数据库的静态视图,因而可以通过快照访问特定时间点的数据. 将查询实施在数据库的快照上,可以释放主体数据库上的资源. 数据库快照的限制 ...

  3. 如何在html中引入jsx文件

    不使用webpack工具做react项目 1.引入react相关js文件 <script src="https://cdn.staticfile.org/react/16.4.0/um ...

  4. 清除display:inline-block元素换行符间隙font-size:0;

    font-size:0; 清除display:inline-block元素换行符间隙 看例子: css: .dd {background-color: #ddd;} .dd2 {background- ...

  5. web开发菜鸟应该如何向前端大神提问题(一次性把问题描述清楚)

    1. 问题的环境和背景这里的背景一般包括,是针对桌面浏览器还是移动端开发?如果是桌面浏览器,则兼容性要求如何?比方说,你来咨询父级是百分比高度的垂直居中效果,你就要说明,你这个效果是需要兼容IE7+还 ...

  6. 算法学习--Day6

    题目描述 实现一个加法器,使其能够输出a+b的值. 输入描述: 输入包括两个数a和b,其中a和b的位数不超过1000位. 输出描述: 可能有多组测试数据,对于每组数据, 输出a+b的值. 示例1 输入 ...

  7. 2014-5-16 NOIP模拟赛

    Problem 1 抓牛(catchcow.cpp/c/pas) [题目描述] 农夫约翰被通知,他的一只奶牛逃逸了!所以他决定,马上出发,尽快把那只奶牛抓回来. 他们都站在数轴上.约翰在N(O≤N≤1 ...

  8. 日志组件Log2Net的介绍和使用(附源码开源地址)

    Log2Net是一个用于收集日志到数据库或文件的组件,支持.NET和.NetCore平台. 此组件自动收集系统的运行日志(服务器运行情况.在线人数等).异常日志.程序员还可以添加自定义日志. 该组件支 ...

  9. iOS 7 隐藏特性

    当 iOS7 刚发布的时候,全世界的苹果开发人员都立马尝试着去编译他们的app,接着再花上数月的时间来修复任何出现的故障,甚至重做app.这样的结果,使得人们根本无暇去探究 iOS7 所带来的新东西. ...

  10. flask_context

    定义全局的钩子函数 有的时候在处理请求之前和之后,执行某些特定的代码是很有用的,这就用到了请求钩子 例如在请求之前创建数据库连接或者redis连接:或者是系统里面用户请求处理之前先验证用户的身份,是否 ...