题目大意:数的最大独立集问题。特殊在要求回答答案是否唯一。

题目分析:定义状态dp(i,1),dp(i,0)分别表示以i为根节点的子树选不选i最多可选的人数,f(i,1),f(i,0)分别表示以i为根节点的子树选不选i的方案唯一性。则当选i时,i的子节点都不能选,否则,可选可不选,因此状态转移方程如下:

dp(i,1)=sum(dp(j,0)  其中,j是i的子节点

dp(i,0)=sum(max(dp(j,1),dp(j,0)))  其中,j是i的子节点

至于当前状态的唯一性,则受下一步决策的唯一性所影响。

代码如下:

  1. # include<iostream>
  2. # include<cstdio>
  3. # include<map>
  4. # include<vector>
  5. # include<cstring>
  6. # include<algorithm>
  7. using namespace std;
  8. int n,dp[205][2],f[205][2];
  9. string p,q;
  10. map<string,int>mp;
  11. vector<int>sons[205];
  12. int DP(int u,int k)
  13. {
  14. if(dp[u][k]!=-1)
  15. return dp[u][k];
  16. if(sons[u].empty()){
  17. f[u][k]=1;
  18. return dp[u][k]=k;
  19. }
  20. int l=sons[u].size();
  21. int ans=k;
  22. if(k==1){
  23. f[u][k]=1;///唯一性受下一步决策的影响
  24. for(int i=0;i<l;++i){
  25. ans+=DP(sons[u][i],0);
  26. if(f[sons[u][i]][0]==0)
  27. f[u][k]=0;
  28. }
  29. }else{
  30. f[u][k]=1;///唯一性受下一步决策的影响
  31. for(int i=0;i<l;++i){
  32. int a=DP(sons[u][i],1);
  33. int b=DP(sons[u][i],0);
  34. if(a>b){
  35. ans+=a;
  36. if(f[sons[u][i]][1]==0)
  37. f[u][k]=0;
  38. }else if(a==b){
  39. ans+=a;
  40. f[u][k]=0;
  41. }else{
  42. ans+=b;
  43. if(f[sons[u][i]][0]==0)
  44. f[u][k]=0;
  45. }
  46. }
  47. }
  48. return dp[u][k]=ans;
  49. }
  50. int main()
  51. {
  52. while(scanf("%d",&n)&&n)
  53. {
  54. mp.clear();
  55. memset(dp,-1,sizeof(dp));
  56. for(int i=1;i<=n;++i)
  57. sons[i].clear();
  58. int cnt=1;
  59. cin>>p;
  60. mp[p]=cnt++;
  61. for(int i=1;i<n;++i){
  62. cin>>p>>q;
  63. if(mp[p]==0)
  64. mp[p]=cnt++;
  65. if(mp[q]==0)
  66. mp[q]=cnt++;
  67. sons[mp[q]].push_back(mp[p]);
  68. }
    ///一开始以为大BOSS必须要到场,WA了两次后才意识到大BOSS应该和其他员工一视同仁!!!
  69. int a=DP(1,1),b=DP(1,0);
  70. if(a>b){
  71. printf("%d ",a);
  72. if(f[1][1]==1)
  73. printf("Yes\n");
  74. else
  75. printf("No\n");
  76. }else if(a==b){
  77. printf("%d ",a);
  78. printf("No\n");
  79. }else{
  80. printf("%d ",b);
  81. if(f[1][0]==1)
  82. printf("Yes\n");
  83. else
  84. printf("No\n");
  85. }
  86. }
  87. return 0;
  88. }

  

  

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 Party at Hali-Bula 树的最大独立集

    题意:  给定n个人,存在上下级关系,每个人只有一个上级,求最大独立集.并判断最大独立集是否唯一 思路:d[i][0]表示以i为根的子树中,不选择第i个节点的最大独立集,f[i][0]表示以i为根的子 ...

  10. Uva 1220,Hali-Bula 的晚会

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

随机推荐

  1. OAuth : open Authorization 开发授权

    OAuth : open Authorization 开发授权 用户访问慕课网,慕课网请求OAuth登陆页面,用户输入QQ号码和密码,这个页面的域名不属于慕课网是属于QQ的,随后把结果给慕课网,这个结 ...

  2. MySQL Crash Course #07# Chapter 15. 关系数据库. INNER JOIN. VS. nested subquery

    索引 理解相关表. foreign key JOIN 与保持参照完整性 关于JOIN 的一些建议,子查询 VS. 联表查询 我发现MySQL 的官方文档里是有教程的. SQL Tutorial - W ...

  3. JavaScript中变量提升------Hoisting

    原谅链接:http://www.cnblogs.com/damonlan/archive/2012/07/01/2553425.html 因为这个问题很是经典,而且容易出错,所以在介绍一次.哈哈.莫怪 ...

  4. UVa 12661 Funny Car Racing - spfa

    很简单的一道最短路问题.分情况处理赛道的打开和关闭. Code /** * UVa * Problem#12661 * Accepted * Time:50ms */ #include<iost ...

  5. python学习笔记比较全

    注:本笔记基于python2.6而编辑,尽量的偏向3.x的语法 Python的特色 1.简单 2.易学 3.免费.开源 4.高层语言: 封装内存管理等 5.可移植性: 程序如果避免使用依赖于系统的特性 ...

  6. linux下有线网卡出现ADDRCONF(NETDEV_UP): eth0: link is not ready的解决方法

    一.背景 2018年5月24日,笔者的pc已经连续运转两天了,突然要使用有线网卡,却发现有线网卡无法正常工作,于是查看了一下内核日志: r8169 0000:05:00.0 eth0: link do ...

  7. jQuery ajax 添加头部参数跨域

    1.添加HTTP文件头 $.ajax({ url: "http://www.baidu.com", //contentType: "text/html; charset= ...

  8. Where is HttpContent.ReadAsAsync?

    It looks like it is an extension method (in System.Net.Http.Formatting): HttpContentExtensions Class ...

  9. Excel中的基本概念

    Excel的相关概念工作薄:由若干个工作表组成,一个工作薄就是一个Excel文件.启动Excel或者新建文档时,Excel建立的缺省工作簿文件名为book1,book2,……其扩展名为xls工作薄内工 ...

  10. HDU 2874 Connections between cities(LCA离线算法实现)

    http://acm.hdu.edu.cn/showproblem.php?pid=2874 题意: 求两个城市之间的距离. 思路: LCA题,注意原图可能不连通. 如果不了解离线算法的话,可以看我之 ...