hdu 2412 Party at Hali-Bula【树形dp】
和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】的更多相关文章
- 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 ...
- HDU 1520.Anniversary party 基础的树形dp
Anniversary party Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- HDU 3586 Information Disturbing(二分+树形dp)
http://acm.split.hdu.edu.cn/showproblem.php?pid=3586 题意: 给定一个带权无向树,要切断所有叶子节点和1号节点(总根)的联系,每次切断边的费用不能超 ...
- HDU 5682 zxa and leaf 二分 树形dp
zxa and leaf 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5682 Description zxa have an unrooted t ...
- HDU 6201 2017沈阳网络赛 树形DP或者SPFA最长路
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6201 题意:给出一棵树,每个点有一个权值,代表商品的售价,树上每一条边上也有一个权值,代表从这条边经过 ...
- hdu 4612 Warm up 双连通+树形dp思想
Warm up Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Total S ...
- 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 ...
- HDU 1054 Strategic Game(最小点覆盖+树形dp)
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=106048#problem/B 题意:给出一些点相连,找出最小的点数覆盖所有的 ...
- HDU 5977 Garden of Eden (树形dp+快速沃尔什变换FWT)
CGZ大佬提醒我,我要是再不更博客可就连一月一更的频率也没有了... emmm,正好做了一道有点意思的题,就拿出来充数吧=.= 题意 一棵树,有 $ n (n\leq50000) $ 个节点,每个点都 ...
随机推荐
- Leetcode415Add Strings字符串相加
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和. 注意: num1 和num2 的长度都小于 5100. num1 和num2 都只包含数字 0-9. num1 和num2 都不包 ...
- linux和window双系统下修改系统启动项
参考:http://jingyan.baidu.com/article/63acb44ae4062c61fcc17e27.html: 我们在安装双系统之后经常会遇到想打开windows但默认启动项是u ...
- Java处理正则验证手机号-详解
参考博客:https://www.cnblogs.com/wangzn/p/7212587.html https://www.cnblogs.com/go4mi/p/6426215.html pack ...
- Apache-Shiro分布式环境配置(与redis集成)(转)
原文戳我 前段时间项目要用到权限控制的相关模块,经过讨论决定采用Apache下面的Shiro开源框架进行身份校验与权限控制,因项目需部署在集群环境下,所以需要分布式的支持,故配置了Redis作为权限数 ...
- oracle创建定时任务
一.dmbs_job dbms_job涉及到的知识点 1.创建job: variable jobno number; dbms_job.submit(:jobno, —-job号 'your_pro ...
- Vijos1212 Way Selection [2017年6月计划 二分图03]
Way Selection 背景 小杉家族遭遇了前所未有的大危机 他想知道怎么逃生 描述 小杉家族r个人正在一片空地上散步,突然,外星人来了…… 留给小杉家族脱逃的时间只有t秒,每个小杉都有一个跑的速 ...
- toString方法和valueof()方法的区别
JavaScript引用类型之Array数组的toString()和valueof()方法的区别 一.转换方法 1.在JavaScript中几乎所有对象都具有toLocaleString().to ...
- placeholder改变输入框字体颜色
::-webkit-input-placeholder { color: #888;}:-moz-placeholder { color: #888;}::-moz-placeholder{col ...
- DMSkin https://github.com/944095635/DMSkin
与源码无关内容 1.如果你有XAML相关的外包需求,可以通过QQ或微信与我取得联系.(QQ:"944095635" 微信号:"qq944095635") 2.我 ...
- 产生冠军 HDU - 2094 (拓扑排序)
分析: 当有且只有一个节点入度为0时,该节点即为冠军,否则不能产生冠军.所以以下代码中只要入度大于0的无论是几都将其设置为1. #include <stdio.h> #include &l ...