【poj3342】 Party at Hali-Bula
http://poj.org/problem?id=3342 (题目链接)
题意
给出一棵树,要求在不存在两个节点相邻的条件下,选出尽可能多的节点,并且判断是否有多种选法。
Solution
很水的树形dp,2个月前的自己Wa的不要不要的,现在的自己1A。。
${f[i][0]}$表示${i}$不去的最大人数,${f[i][1]}$表示${i}$去的最大人数。关键是如何去判断方案的唯一性。
对于节点${x}$,我们分情况讨论。
1.${x}$去更优。${f[x][1]}$只能由${f[son[x]][0]}$转移过来,那么方案肯定是唯一的,所以我们直接去搜索${son[x]}$的儿子节点。
2.${x}$不去更优。${f[x][0]}$能由${f[son[x]][0]}$或者是${f[xon[x]][1]}$转移过来,而如果${f[x][0]}$的值可以由多种方案得到,那么必然是${x}$的某个儿子节点去和不去的人数相等。
3.${x}$去与不去的人数相等。那么直接返回1。。
至此,问题已经解决。
代码
// poj3342
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<string>
#include<cmath>
#include<map>
#define MOD 100003
#define inf 2147483640
#define LL long long
#define free(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout);
using namespace std; const int maxn=300;
struct edge {int to,next;}e[maxn<<1];
map<string,int> mp;
int head[maxn],f[maxn][2],cnt,n,m; void link(int u,int v) {
e[++cnt].to=v;e[cnt].next=head[u];head[u]=cnt;
}
void Init() {
mp.clear();cnt=n=0;
memset(head,0,sizeof(head));
memset(f,0,sizeof(f));
}
void dfs(int x) {
f[x][0]=0;f[x][1]=1;
for (int i=head[x];i;i=e[i].next) {
dfs(e[i].to);
f[x][0]+=max(f[e[i].to][1],f[e[i].to][0]);
f[x][1]+=f[e[i].to][0];
}
}
bool check(int x) {
if (f[x][0]==f[x][1]) return 0;
if (f[x][0]>f[x][1]) {
for (int i=head[x];i;i=e[i].next)
if (!check(e[i].to)) return 0;
}
else {
for (int i=head[x];i;i=e[i].next)
for (int j=head[e[i].to];j;j=e[j].next)
if (!check(e[j].to)) return 0;
}
return 1;
}
int main() {
while (scanf("%d",&m)!=EOF && m) {
Init();
string s1,s2;
cin>>s1;mp[s1]=(n=1);
for (int i=1;i<m;i++) {
cin>>s1>>s2;
if (!mp[s1]) mp[s1]=++n;
if (!mp[s2]) mp[s2]=++n;
link(mp[s2],mp[s1]);
}
dfs(1);
printf("%d %s\n",max(f[1][0],f[1][1]),check(1) ? "Yes" : "No");
}
return 0;
}
【poj3342】 Party at Hali-Bula的更多相关文章
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- 【原】谈谈对Objective-C中代理模式的误解
[原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- 【调侃】IOC前世今生
前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...
- Python高手之路【三】python基础之函数
基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...
- Python高手之路【一】初识python
Python简介 1:Python的创始人 Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种解释型.面向对象.动态数据类型的高级程序设计语言,由荷兰人Guido ...
- 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】
说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...
- 【原】FMDB源码阅读(二)
[原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...
随机推荐
- myeclipse 8.5离线安装python插件
看到网上很多教程扯了一大堆,好麻烦的样子. 1)下载pyhon开发插件,PyDev 2.2.0.zip 我在百度137708820网盘里已分享,链接http://pan.baidu.com/s/1mg ...
- 重构Web Api程序(Api Controller和Entity) 续篇(1)
经过一系列重构,你眼明的话,还是可以看到还有重构的地方,如: string newFileName = "~/Temp/" + Guid.NewGuid().ToString() ...
- Linux Linux程序练习十五(进程间的通信共享内存版)
/* * 题目: * 编写程序,要去实现如下功能: 父进程创建子进程1和子进程2.子进程1向子进程2发送可靠信号,并传送额外数据为子进程1的pid*2; 子进程2接受可靠信号的值,并发送给父进程,父进 ...
- IE8下获取iframe document EVENT对象的问题
在一个页面中设置iframe的document Onclick 事件获取在iframe中的document被点击的对象,W3C如下: document.getElementById('iframe的I ...
- mybatis 3.2.8 + log4j2.0.2 控制台输出sql语句
mybatis3.2.7有一个bug,使用log4j2 (2.0.2)版本时,会找不到类 ,导致启动失败,详见 https://github.com/mybatis/mybatis-3/issues/ ...
- Android -- ActivityLifeCycleCallbacks
ActivityLifeCycleCallbacks Application通过此接口提供了一套回调方法,用于让开发者对Activity的生命周期事件进行集中处理. 为什么用ActivityLifec ...
- 45个JavaScript小技巧
原文地址 http://modernweb.com/2013/12/23/45-useful-javascript-tips-tricks-and-best-practices/ 这篇文章的质量个人感 ...
- 求连续最大子序列积 - leetcode. 152 Maximum Product Subarray
题目链接:Maximum Product Subarray solutions同步在github 题目很简单,给一个数组,求一个连续的子数组,使得数组元素之积最大.这是求连续最大子序列和的加强版,我们 ...
- REST API (from IBM)
REST 本身是设计风格而不是标准.REST 谈论一件非常重要的事,如何正确地使用 Web标准,例如,HTTP 和 URI.想要了解 REST 最好的方式就是思索与了解 Web 及其工作方式.如果你设 ...
- mysql union和union all的区别
union 对两个结果集进行并集操作,重复数据只显示一次 Union All,对两个结果集进行并集操作,重复数据全部显示 工具/原料 mysql 数据库 方法/步骤 student表数据 使用 ...