HDU 2412

  和poj 2342(hdu 1520)差不多,多了一个判断最优解是(Yes)否(No)唯一。关键问题也在这个判断最优解是否唯一上。

  先定义dp[u][2],表示选(dp[][1])或不选(dp[][0])当前节点u所获得的最大值。

    对于叶子节点  :dp[u][0]=0,dp[u][1]=1;

    对于非叶子节点:dp[u][0]=Σmax(dp[v][0],dp[v][1])(v是u的儿子节点)

            dp[u][1]+=Σdp[j][0]

  最大值答案即为:max(dp[1][0],dp[1][1])(以1为根节点)。

  下面考虑如何判断最优解是否唯一(v是u的儿子节点):  

    先定义dup[u][2]。dup[u][0]表示不选u节点是(dup[u][0]=1)否(dup[u][0]=0)会有多解,dup[u][1]表示选u节点是(dup[u][0]=1)否(dup[u][0]=0)会有多解。  (本来不想先定义状态,想根据逻辑推出需要这个状态的,但感觉不太好叙述,就这样吧)

    如果选v节点比不选v节点优(dp[v][1]>dp[v][0])而且选v节点时目前最优解不唯一(dup[v][1]=1),那么说明不选u节点时最优解也不唯一(dup[u][0]=1)。因为此时v要选所以u就不能选,也就是v要选必须u不能选而且由于选v有多解那么推到u不选就有多解。

    其他情况就同理了,比如说不选v节点比选v节点优,那么能推出选u节点会有多解(dup[u][1]=1)

    而且如果不选v节点有多解(dup[v][0]=1),那么选u节点一定会有多解(dup[u][1]=1)。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
const int maxn=;
map<string,int> mp;
vector<int> tree[maxn];
int dp[maxn][],dup[maxn][];
int n; void init()
{
memset(dp,,sizeof(dp));
memset(dup,,sizeof(dup));
for(int i=;i<=n;i++) tree[i].clear();
mp.clear();
} void dfs(int u,int fa)
{
dp[u][]=,dp[u][]=;
for(int i=;i<tree[u].size();i++){
int v=tree[u][i];
if(v==fa) continue;
dfs(v,u);
dp[u][]+=max(dp[v][],dp[v][]);
dp[u][]+=dp[v][];
if(dp[v][]>dp[v][]&&dup[v][]) dup[u][]=;
else if(dp[v][]<dp[v][]&&dup[v][]) dup[u][]=;
else if(dp[v][]==dp[v][]) dup[u][]=;
if(dup[v][]) dup[u][]=;
}
} int main()
{
string s1,s2;
while(cin>>n,n)
{
init();
int t=;
cin>>s1;
mp[s1]=t;
for(int i=;i<n;i++){
cin>>s1>>s2;
if(!mp[s1]){t++,mp[s1]=t;}
if(!mp[s2]){t++,mp[s2]=t;}
tree[mp[s2]].push_back(mp[s1]);
}
dfs(,-);
if(dp[][]>dp[][]&&!dup[][])
cout<<dp[][]<<" Yes"<<endl;
else if(dp[][]<dp[][]&&!dup[][])
cout<<dp[][]<<" Yes"<<endl;
else cout<<max(dp[][],dp[][])<<" No"<<endl;
}
return ;
}

hdu 2412 Party at Hali-Bula【树形dp】的更多相关文章

  1. hdu 2412 Party at Hali-Bula 经典树形DP

    Party at Hali-Bula Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  2. HDU 1520.Anniversary party 基础的树形dp

    Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  3. HDU 3586 Information Disturbing(二分+树形dp)

    http://acm.split.hdu.edu.cn/showproblem.php?pid=3586 题意: 给定一个带权无向树,要切断所有叶子节点和1号节点(总根)的联系,每次切断边的费用不能超 ...

  4. HDU 5682 zxa and leaf 二分 树形dp

    zxa and leaf 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5682 Description zxa have an unrooted t ...

  5. HDU 6201 2017沈阳网络赛 树形DP或者SPFA最长路

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6201 题意:给出一棵树,每个点有一个权值,代表商品的售价,树上每一条边上也有一个权值,代表从这条边经过 ...

  6. hdu 4612 Warm up 双连通+树形dp思想

    Warm up Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total S ...

  7. hdu 1561 The more, The Better(树形dp,基础)

    The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  8. HDU 1054 Strategic Game(最小点覆盖+树形dp)

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=106048#problem/B 题意:给出一些点相连,找出最小的点数覆盖所有的 ...

  9. HDU 5977 Garden of Eden (树形dp+快速沃尔什变换FWT)

    CGZ大佬提醒我,我要是再不更博客可就连一月一更的频率也没有了... emmm,正好做了一道有点意思的题,就拿出来充数吧=.= 题意 一棵树,有 $ n (n\leq50000) $ 个节点,每个点都 ...

随机推荐

  1. 跟我一起做一个vue的小项目(三)

    接下来我们进行轮播的开发 安装插件,选用2.6.7的稳定版本 npm install vue-awesome-swiper@2.6.7 --save 根据其github上面的用法,我们在全局引用,在m ...

  2. TZ_09_常用jQuery操作

    1.实现对chexkbox进行批量删除 checkbox属性 <td><input name="ids" type="checkbox" va ...

  3. WPF学习笔记-用Expression Blend制作自定义按钮

    1.从Blend工具箱中添加一个Button,按住shift,将尺寸调整为125*125; 2.右键点击此按钮,选择Edit control parts(template)>Edit a cop ...

  4. Struts Tiles框架使用(转)

    原文:Struts Tiles框架使用 Tiles框架 ++YONG原创,转载请声明 Tiles框架为创建Web页面提供了一种模板机制,它能将网页的布局和内容分离.它用模板定义网页布局,每个页面模板都 ...

  5. linux环境变量设置命令

    1echo $ <变量名> //显示某个环境变量 2env     // environment (环境) 的简写,列出来所有的环境变量 3set     //显示所有本地定义的Shell ...

  6. 洛谷P1474 [USACO 2.3]货币系统 Money Systems [2017年4月计划 动态规划04]

    P1474 货币系统 Money Systems 题目描述 母牛们不但创建了它们自己的政府而且选择了建立了自己的货币系统.由于它们特殊的思考方式,它们对货币的数值感到好奇. 传统地,一个货币系统是由1 ...

  7. R语言可视化--ggplot函数

    上一篇说了qplot函数,现在说一下ggplot函数 本身不能实现,需要添加层才可以.ggplot2的核心函数 library(ggplot2) ggplot(airquality,aes(Wind, ...

  8. JavaScript--location.href的跳转

    页面重载 true 强制从服务器加载  false 优先从缓存加载  window.location.reload(true); window.location.href.self.location. ...

  9. JRE System Library、Referenced Libraries、Web App Libraries的含义

    JRE System Library.Referenced Libraries.Web App Libraries 这三个都是jar包的存放集合. JRE System Library:指Java S ...

  10. 手把手0基础项目实战(一)——教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)...

    原文:手把手0基础项目实战(一)--教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)... 本文你将学到什么? 本文将以原理+实战的方式,首先对& ...