题意:

公司参加聚会,要求员工不能和他的上司同时参加,求最多能参加几个人并且判断解是否唯一。

要点:

树型DP的经典题,用dp[u][1]表示选取u的最大值,dp[u][0]表示不选取u的最大值,容易得到状态转移方程为dp[u][1] += dp[v][0]和dp[u][0] += max(dp[v][1], dp[v][0]),可以看到如果dp[u][0]>dp[u][1]时,dp[v][1]==dp[v][0]会造成多解,那么我们最后遍历一遍即可判断是否有多解,还有一种情况是dp[0][1]==dp[0][0],这当然也有多解。这题用了map,稍微学了一下,还是很好用的。

15573797 Seasonal 3342 Accepted 212K 16MS C++ 1336B 2016-05-31 09:15:14
#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
vector<int> edge[205];
int dp[205][2];void dfs(int u,int p)
{int i, v;dp[u][0] = 0;//不取当前值dp[u][1] = 1;//取当前值for (i = 0; i < edge[u].size(); i++){int v = edge[u][i];dfs(v, u);dp[u][1] += dp[v][0];dp[u][0] += max(dp[v][1], dp[v][0]);//这里状态转移会造成有不唯一的解}
}int main()
{int n,i,j;char boss[200],a[200],b[200];map<string, int> mm;while (scanf("%d", &n), n){mm.clear();for (i = 0; i < 205; i++)edge[i].clear();int tot = 0;scanf("%s", boss);mm[boss] = tot++;for (i = 0; i < n - 1; i++){scanf("%s%s", a, b);if (mm.find(a) == mm.end()) mm[a] = tot++;if (mm.find(b) == mm.end()) mm[b] = tot++;//如果map中没有b,就把b加入,对应的映射是totedge[mm[b]].push_back(mm[a]);}dfs(0, 0);bool flag = true;for (i = 0; i < n; i++){flag = true;if (dp[i][0]>dp[i][1])//只有取dp[i][0]时可能有多解{for (j = 0; j < edge[i].size(); j++){if (dp[edge[i][j]][0] == dp[edge[i][j]][1]){flag = false;break;}}}if (!flag)break;}printf("%d ", max(dp[0][0], dp[0][1]));if (!flag||dp[0][1]==dp[0][0])//还有一种是总体考虑boss要不要选造成的多解printf("No\n");elseprintf("Yes\n");}return 0;
}

转载于:https://www.cnblogs.com/seasonal/p/10343729.html

POJ3342 Party at Hali-Bula(树型DP求最大独立集+唯一解判断)相关推荐

  1. 其他OJ 树型DP 选课

    在朱全民的PPT介绍的一个树型DP经典题,<选课>,中文题目,不结束 找了很久找到了可以提交的OJ,重庆八中 http://www.cqoi.net:2012/JudgeOnline/pr ...

  2. 【树型DP】BZOJ1564 二叉查找树(noi2009)

    标签: 二叉查找树 [题目描述] 已知一棵特殊的二叉查找树.根据定义,该二叉查找树中每个结点的数据值都比它左儿子结点的数据值大,而比它右儿子结点的数据值小. 另一方面,这棵查找树中每个结点都有一个权值 ...

  3. 【树型DP】加分二叉树

    问题 b: [树型DP]加分二叉树 时间限制: 1 Sec  内存限制: 64 MB 提交: 8  解决: 6 [提交] [状态] [讨论版] [命题人:admin] 题目描述 科技忽略了过程就是魔法 ...

  4. 二叉苹果树(树型DP+背包)

    二叉苹果树 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点).这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 我们用一根树枝两端连接的结点的编号 ...

  5. 虚树+树型DP SDOI2011消耗战

    <虚树+树型DP> SDOI2011消耗战 #include <iostream> #include <cstdio> #include <cstring&g ...

  6. BSOJ 2923:藤原妹红 MST+树型DP

    2923 -- [模拟试题]藤原妹红 Description 在幻想乡,藤原妹红是拥有不老不死能力的人类.虽然不喜欢与人们交流,妹红仍然保护着误入迷途竹林村民.由于妹红算得上是幻想乡最强的人类,对于她 ...

  7. 洛谷P3354 Riv河流 [IOI2005] 树型dp

    正解:树型dp 解题报告: 传送门! 简要题意:有棵树,每个节点有个权值w,要求选k个节点,最大化∑dis*w,其中如果某个节点到根的路径上选了别的节点,dis指的是到达那个节点的距离 首先这个一看就 ...

  8. hihocoder 1479 三等分 树型dp

    描述 小Hi最近参加了一场比赛,这场比赛中小Hi被要求将一棵树拆成3份,使得每一份中所有节点的权值和相等. 比赛结束后,小Hi发现虽然大家得到的树几乎一模一样,但是每个人的方法都有所不同.于是小Hi希 ...

  9. 蓝桥杯:生命之树【树型dp】

    之前本菜还没学树型dp的时候,下意识地认为这个东西很难,感觉这个东西结合了搜索+dp这两座算法界的大山必定很难,但万万没想到啊,这个东西很像我之前讲的记忆化搜索,甚至我认为,记忆化搜索的一个作用就是将 ...

最新文章

  1. vc6静态库的生成和调用
  2. Linux服务器---关闭selinux
  3. 【Java代码】使用双冒号 :: 简洁代码及方法引用(静态方法+构造方法+实例方法+函数式编程举例)
  4. outlook的插件管理(Web界面)
  5. Python语言 目录
  6. 三星s2 硬刷Android 8,三星T710(GALAXY Tab S2 8.0)一键救砖教程,轻松刷回官方系统...
  7. python考勤管理系统_python基础教程:face++与python实现人脸识别签到(考勤)功能...
  8. C语言编程乐高,ROBOLAB 2.9 编程指南第五章乐高机器人-基础小实验
  9. 掌控人生的姑娘,从不活在PS里
  10. 基于SSM的微信小程序在线学习系统源码【包调试】
  11. mysql my.cnf 字符集_my.cnf 中字符集设置
  12. 小小Mac:Web移动端适配方案
  13. 静态网网页设计成品下载
  14. java 国际化_Java国际化基础
  15. matlab求解三次多项式,【MATLAB编程】三次样条
  16. java 家谱管理系统_家谱管理系统
  17. 看看电销外呼系统排行,选择哪家外呼公司靠谱?
  18. p10测试闪存软件怎么用,华为p10的闪存类型怎么查看?查看华为p10闪存教程
  19. 详解Jetpack Compose中的Modifier修饰符
  20. channel 1:open failed : administratively prohibited : open failed

热门文章

  1. 接口测试(apipost、jmeter和python脚本)
  2. tcpdf html 支持css吗,TCPDF 5.1 发布,增加对CSS的支持
  3. mpvue 调起子组件的方法_牢记 | 智鹏五金机电设备这些方法的使用更安全!
  4. 暗黑破坏神java魔法护身,发个实用的贴!!暗黑+1+2技能护身符合成,望大家顶下,能加精...
  5. cout 数组_C++数组|快速排序、二分法查找及其时间复杂度
  6. web前端的进阶路线大剖析!初学者如何迅速“升级”!
  7. 零基础开始学前端有什么建议?
  8. 谁说 JavaScript 简单的?
  9. python中intvar_Python的IntVar设置
  10. c语言单词的一个字母变换,c语言:输入一行英文字符串,把每个单词第一个字母变为大写,输出修改后的字符串知道...