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. 【python之路30】反射

    一.反射 1.反射的基本介绍: 反射是所有程序的专有名词,在java,C#语言中都存在反射,那么什么是反射呢? python中 的反射概括来说:是通过字符串的形式导入模块,并通过字符串的形式去模块中寻 ...

  2. 【python之路28】模块python与excel

    一.可使用的第三方库 python中处理excel表格,常用的库有xlrd(读excel)表.xlwt(写excel)表.openpyxl(可读写excel表)等.xlrd读数据较大的excel表时效 ...

  3. JavaScript中this的指向(转载)

    转载自:http://www.cnblogs.com/dongcanliang/p/7054176.html 前言 this 指向问题是入坑前端必须了解知识点,现在迎来了ES6时代,因为箭头函数的出现 ...

  4. java 7,8 排序异常

    排序报 java.lang.IllegalArgumentException: Comparison method violates its general contract! 要明确返回-1, 0, ...

  5. svn清理以下路径失败

    网上说是svn的数据库挂了 删除里免得数据就好了 用sqllite...嗯? 那我还得下载一个?超过五秒钟的工作我是不会去做的 打开navicat 清空表 再次尝试清理

  6. Java基础-注解

    什么是注解? Jdk1.5新增新技术,注解.很多框架为了简化代码,都会提供有些注解.可以理解为插件,是代码级别的插件,在类的方法上写:@XXX,就是在代码上插入了一个插件. 注解不会也不能影响代码的实 ...

  7. zoj 1028 Flip and Shift(数学)

    Flip and Shift Time Limit: 2 Seconds      Memory Limit: 65536 KB This puzzle consists of a random se ...

  8. jquery购物评分

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. Python2.7用sys.stdout.write实现打印刷新

    如何能在控制台实现在一行中显示进度的信息呢,就像使用pip安装时的进度那样. 如果用print则会打印成多行,下面这个小技巧可以在一行中打印: import time import sys if __ ...

  10. Swift 之 函数与闭包的应用实例

    http://www.cocoachina.com/swift/20160106/14862.html 今天的博客算是比较基础的,还是那句话,基础这东西在什么时候都是最重要的.说到函数,只要是写过程序 ...