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的更多相关文章

  1. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  2. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  3. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  4. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  5. 【调侃】IOC前世今生

    前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...

  6. Python高手之路【三】python基础之函数

    基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...

  7. Python高手之路【一】初识python

    Python简介 1:Python的创始人 Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种解释型.面向对象.动态数据类型的高级程序设计语言,由荷兰人Guido ...

  8. 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】

    说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...

  9. 【原】FMDB源码阅读(二)

    [原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...

随机推荐

  1. MVC控制器总结

    1.特性 [AuthorizeFilter]  用于权限过滤 [HttpGet] [HttpPost] 2.参数 获取方法 public ActionResult void Get(int id){} ...

  2. quartz.net 项目无法加载的问题

    最近尝试试用一下quartz.net 做任务调度用. 下载了源代码后打开解决方案发现项目无法加载.错误如下 未找到导入的项目“C:\Users\****\Desktop\Quartz.NET-2.1. ...

  3. web学习第一章

    web学习第一章   我是大概9月10日开始走上IT之路的,一开始学习了小段时间的自动化办公软件, 昨天我开始学习客户端网页编程,我了解什么是WEB,一些比较老古董的计算模式和发展历史,印象最让我深刻 ...

  4. PhoneGap: Android 自定义组件

    Hello Core Demo Plugin Development(组件部署): http://docs.phonegap.com/en/2.0.0/guide_plugin-development ...

  5. Tomcat 项目部署方式

    方法一:在Tomcat中的Conf目录中,在Server.Xml中的,<Host/>节点中添加: <Context Path="/Hello"Docbase=&q ...

  6. C#发展历程以及C#6.0新特性

    一.C#发展历程 下图是自己整理列出了C#每次重要更新的时间及增加的新特性,对于了解C#这些年的发展历程,对C#的认识更加全面,是有帮助的. 二.C#6.0新特性 1.字符串插值 (String In ...

  7. 腾讯 or 华为 =》 求职者的困惑

    本文目的: 希望有老司机指点迷津 个人背景: 本人软件工程专业,硕士研究生,2017年7月毕业,个人喜欢Java开发,希望有机会从事Java分布式应用开发 故事背景一: 本人2016年4月份参加了腾讯 ...

  8. 转载:SQL 递归树 子父节点相互查询

    if object_id('[tb]') is not null drop table [tb] go create table [tb]([modeid] int,modename varchar( ...

  9. 如何采集QQ群中所有成员QQ号码

    安装Google Chrome浏览器 安装Google插件:Regex Scraper 在群成员页面点击Regex 插件, 粘贴上这个代码 text_overflow">([\S\s] ...

  10. AutoMapperHelper

    /// <summary> /// AutoMapper帮助类 /// </summary> public static class AutoMapperHelper { // ...