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. LA3905 Meteor

    https://vjudge.net/problem/UVALive-3905 计算出每个点在相框中的时间段,扫描线做即可 关键在如何快速计算每个点在相框中的时间段.对每个点进行运动分解,进入的时间L ...

  2. Veristand学习札记(3)- CD的开发

    转载:https://blog.csdn.net/mfcjishiben/article/details/79417739 1 CustomDevice开发 CD的开发必须遵照NI提供的模板进行.安装 ...

  3. 超干货!Cassandra Java堆外内存排查经历全记录

    背景 最近准备上线cassandra这个产品,同事在做一些小规格ECS(8G)的压测.压测时候比较容易触发OOM Killer,把cassandra进程干掉.问题是8G这个规格我配置的heap(Xmx ...

  4. CF 578B "Or" Game

    传送门 解题思路 题意大概是给你一个数列,可以进行k次操作,每次操作可以选择一个数乘x,问操作后的或的最大值.根据位运算,位数越高答案越优,所以贪心的使这k次操作全都放到一个数上,这样的结果肯定较优. ...

  5. [转]深入理解ajax系列——响应编码

    我们接收到的 ajax 响应主体类型可以是多种形式的,包括字符串String.ArrayBuffer对象.二进制Blob对象.JSON对象.javascirpt文件及表示 XML文档的Document ...

  6. MacBook安装QF9700网卡驱动

    HOW TO USE A GENERIC USB ETHERNET ADAPTER QF9700 ON MAC OS X  20 February 2016  macOS  Zahid Mahmood ...

  7. 3_58 csapp 第三版的答案

    参考代码了http://blog.csdn.net/scf0920/article/details/77543294 3.58 看汇编写c代码 long decode(long x, long y,l ...

  8. Oracle存储1.1

    1.生成一个表的简单sql语句 CREATE OR REPLACE PROCEDURE proc_AutoGenerateSQL(  tableName   VARCHAR2 ,--参数 需要操作的表 ...

  9. 词袋和 TF-IDF 模型

    做文本分类等问题的时,需要从大量语料中提取特征,并将这些文本特征变换为数值特征.常用的有词袋模型和TF-IDF 模型 1.词袋模型 词袋模型是最原始的一类特征集,忽略掉了文本的语法和语序,用一组无序的 ...

  10. 机器学习中的那些树——决策树(三、CART 树)

    前言 距上篇文章已经过了9个月 orz..趁着期末复习,把博客补一补.. 在前面的文章中介绍了决策树的 ID3,C4.5 算法.我们知道了 ID3 算法是基于各节点的信息增益的大小 \(\operat ...