Party at Hali-Bula

UVA - 1220

题意: 
公司里有n(n<=200)个人形成一个树状结构, 要求尽量选多的人,但不能同时选择一个人和他的直属上司,文最多能选多少人,以及是否方案唯一。

  1 //dp[x][0]表示不选X节点能达到的最大人数,dp[x][1]表示选x节点的最大人数
  2 //f数组含义和dp基本一致,f[x][0]表示如果不选x节点是否方案数唯一 f[x][1]表示如果选x节点方案数是否唯一
  3 //如果f数组为1表示方案数不唯一
  4 //对于一个根节点,如果其子节点中有一个方案数不唯一则其方案数不唯一
  5
  6 #include<iostream>
  7 #include<cstdio>
  8 #include<cstring>
  9 #include<map>
 10 #include<vector>
 11 #include<algorithm>
 12 using namespace std;
 13 vector<int>v[500];
 14 string s1,s2;
 15 map<string,int>mp;
 16 int n;
 17 int flag;
 18 int dp[500][500];
 19 int f[500][500];
 20 int vis[500];
 21 void dfs(int x)
 22 {
 23
 24     dp[x][0]=0;
 25     dp[x][1]=1;
 26     vis[x]=1;
 27     for(int i=0;i<v[x].size();i++)
 28     {
 29         int to=v[x][i];
 30         if(vis[to])
 31              continue;
 32         dfs(to);
 33         //选根节点
 34         dp[x][1]+=dp[to][0];
 35         if(f[to][0])
 36         {
 37             f[x][1]=1;
 38         }
 39         //不选根节点
 40         if(dp[to][0]>dp[to][1])
 41         {
 42             dp[x][0]+=dp[to][0];
 43             if(f[to][0])
 44             {
 45                 f[x][0]=1;
 46             }
 47         }
 48         else
 49         {
 50             dp[x][0]+=dp[to][1];
 51             if(f[to][1]||dp[to][0]==dp[to][1])
 52             {
 53                 f[x][0]=1;
 54             }
 55         }
 56     }
 57     return ;
 58 }
 59 int main()
 60 {
 61     while(~scanf("%d",&n)&&n)
 62     {
 63         memset(vis,0,sizeof(vis));
 64         memset(dp,0,sizeof(dp));
 65         memset(f,0,sizeof(f));
 66         for(int i=0;i<500;i++)
 67             v[i].clear();
 68         mp.clear();
 69         cin>>s1;
 70         int cnt=1;
 71         if(!mp[s1])
 72         {
 73             mp[s1]=cnt++;
 74         }
 75         n--;
 76         while(n--)
 77         {
 78             cin>>s1>>s2;
 79             if(!mp[s1])
 80             {
 81                 mp[s1]=cnt++;
 82             }
 83             if(!mp[s2])
 84             {
 85                 mp[s2]=cnt++;
 86             }
 87             v[mp[s2]].push_back(mp[s1]);
 88         }
 89         flag=0;
 90         dfs(1);
 91         printf("%d ",max(dp[1][0],dp[1][1]));
 92         if(dp[1][0]==dp[1][1])
 93         {
 94             puts("No");
 95         }
 96         else
 97         {
 98              if(dp[1][0]>dp[1][1])
 99             {
100                 if(f[1][0])
101                     cout<<"No"<<endl;
102                 else
103                     cout<<"Yes"<<endl;
104             }
105             else if(dp[1][1]>dp[1][0])
106             {
107                 if(f[1][1])
108                     cout<<"No"<<endl;
109                 else
110                     cout<<"Yes"<<endl;
111             }
112
113         }
114     }
115 }

转载于:https://www.cnblogs.com/1013star/p/9942412.html

Party at Hali-Bula(树形DP+判断方案数是否唯一)相关推荐

  1. POJ 3342- Party at Hali-Bula (树形dp+判断是否唯一)

    题目: Dear Contestant, I'm going to have a party at my villa at Hali-Bula to celebrate my retirement f ...

  2. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 "低价购买"这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:"低价购买:再低价购买".每次你购买一支股 ...

  3. 左神算法:判断二叉树是否为平衡二叉树(树形dp套路,Java版)

    本题来自左神<程序员代码面试指南>"判断二叉树是否为平衡二叉树"题目. 题目 平衡二叉树的性质为:要么是一棵空树,要么任何一个节点的左右子树高度差的绝对值不超过 1. ...

  4. 洛谷:P4516 [JSOI2018] 潜入行动(树形dp、树上分组背包统计方案数)

    潜入行动 题意: 在树上每个点可以放置监控设备,监控该点周围的点(不包括该点),问刚好放置 k 个监控设备监控使得整棵树所有点都被监控的方案数是多少. 思路: 显然是个树形dp,k个监控自然联想分组背 ...

  5. 青云的机房组网方案(简单+普通+困难)(虚树+树形DP+容斥)

    题目链接 1.对于简单的版本n<=500, ai<=50 直接暴力枚举两个点x,y,dfs求x与y的距离. 2.对于普通难度n<=10000,ai<=500 普通难度解法挺多 ...

  6. “今日头条杯”首届湖北省大学程序设计竞赛 D. Who killed Cock Robin(选择联通子图的方案数,树形dp)

    题意: 给定n个点的树,求选出一个联通子图的方案数,答案对1e9+7取模. 数据范围:n<=2e5 解法: 设 d [ x ] 以 x 为 根 的 子 树 中 , 选 择 点 x 之 后 , 连 ...

  7. 【学时总结】◆学时·VIII◆ 树形DP

    ◆学时·VIII◆ 树形DP DP像猴子一样爬上了树--QwQ ◇ 算法概述 基于树的模型,由于树上没有环,满足DP的无后效性,可以充分发挥其强大统计以及计算答案的能力. 一般来说树形DP的状态定义有 ...

  8. bzoj4472: [Jsoi2015]salesman(树形dp)

    Description 某售货员小T要到若干城镇去推销商品,由于该地区是交通不便的山区,任意两个城镇 之间都只有唯一的可能经过其它城镇的路线. 小T 可以准确地估计出在每个城镇停留的净收 益.这些净收 ...

  9. 【CF1646D】D. Weight the Tree(树形dp、贪心)

    加权树 题意: 给定一颗树,让你给树上的点赋予权值.定义一个点的权值等于其所有相邻节点的权重之和时,这个点就是 good. 你需要找到一种赋值方法,使得树中 good 点数最多,同时所有顶点的权重总和 ...

最新文章

  1. 36小时,造一个亚马逊无人商店 | 实战教程+代码
  2. win10运行在哪里_升级!Win10 2004版即将推送,减少CPU占用率,旧电脑也运行如飞...
  3. 代码流程图怎么画_程序流图怎么画?详细图文解析绘制程序流程图
  4. Python中字符串使用方法总结(学习笔记)
  5. 异步加载 防止图片混乱
  6. Oracle 创建dblink
  7. java 实现excel样式设置(居中、字体、大小、换行、合并行,列宽、指定特定字符串样式等)
  8. 汇编:用户登录以及简单数据加密
  9. 解决php上传文件过程中Warning move_uploaded_file, failed to open stream的解决方案
  10. docker 监控之 cadvisor
  11. 《ANSYS Workbench有限元分析实例详解(静力学)》——第1章 CAE分析步骤1.1 模型简化...
  12. python字符画绘制代码_python图片转字符画代码是什么
  13. 如何释放计算机的ip地址,电脑执行释放DNS和更新IP的命令是什么?怎么执行
  14. Matlab在线性代数中的应用(三):求解非齐次线性方程组
  15. mysql timeout的详细介绍
  16. 《孙子兵法战略运筹之谋攻篇》
  17. 云原生的进一步具象化
  18. 有利可图网_第一章:有利可图的项目手册
  19. 数据增强方式mosaic(基于yolo4)代码实现python
  20. 笔记本电脑电池的保养和优化

热门文章

  1. Spring AOP原理及拦截器
  2. Android逆向工程 初篇
  3. FFPEG 转码记录------解决了有流,但是没有码率和FPS?
  4. Linux01-BASH的while流程控制41
  5. 新瓶旧酒ASP.NET AJAX(6) - 客户端脚本编程
  6. 找不到暑期实习怎么办?
  7. 论营销的重要性:以一个磁铁为例
  8. macOS的关于屏幕录制的快捷键和操作
  9. 生死6小时!!!!!!!!!!!!!!!!1
  10. MySQL学习(四)