UVA 1220 Hali-Bula的晚会
题目描述:https://vjudge.net/problem/UVA-1220
判断一个图是否是树:一个图G如果是无回路的连通图,或者是n-1条边的连通图,那么G就是树。树上的DP类问题一般用深度优先遍历解决。
本题几乎就是树的最大独立集问题,不过多了一个要求:判断唯一性。设:
d(u,0)和f(u,0)表示以u为根的子树中,不选u点能得到的最大人数以及方案唯一性
(f(u,0)=1表示唯一,0表示不唯一)。
d(u,1)和f(u,1)表示以u为根的子树中,选u点能得到的最大人数以及方案唯一性。相应地,状态转移方程也有两套。
d(u,1)的计算:因为选了u,所以u的子结点都不能选,因此d(u,1) = sum{d(v,0) | v是u的子结点}。当且仅当所有f(v,0)=1时f(u,1)才是1。
d(u,0)的计算:因为u没有选,所以每个子结点v可选可不选,即d(u,0) = sum{ max(d(v,0) ,
d(v,1)) }。什么情况下方案是唯一的呢?首先,如果某个d(v,0)和d(v,1)相等,则不唯
一;其次,如果max取到的那个值对应的f=0,方案也不唯一(如d(v,0) > d(v,1)
且f(v,0)=0,则f(u,0)=0)。
#include<iostream>
#include<vector>
#include<map>
#include<string.h>
using namespace std;
#define maxn 200+10vector<int> child[maxn];
map<string,int> man;
int dp[maxn][3];
int f[maxn][3];
int n;void initial()
{memset(f,0,sizeof(f));memset(dp,0,sizeof(dp));for(int i=1;i<=n;i++)child[i].clear();man.clear();
}void dfs(int u)
{int size=child[u].size();if(size==0){dp[u][0]=0;dp[u][1]=1;return; }for(int i=0;i<size;i++){int v=child[u][i];dfs(v); if(f[v][0])f[u][1]=1;dp[u][1]+=dp[v][0];int v0=dp[v][0];int v1=dp[v][1];if(v0==v1||(v0>v1&&f[v][0]==1)||(v1>v0&&f[v][1]==1))f[u][0]=1;dp[u][0]+=max(v0,v1);}dp[u][1]++;
}int main()
{cin>>n;while(n!=0){string s;cin>>s;int cnt=0;man[s]=++cnt;for(int i=0;i<n-1;i++){string s1,s2;cin>>s1>>s2;if(!man[s1])man[s1]=++cnt;if(!man[s2])man[s2]=++cnt;child[man[s2]].push_back(man[s1]);}dfs(1);if(dp[1][1]>dp[1][0])printf("%d %s\n",dp[1][1],f[1][1]?"No":"Yes");else if(dp[1][1]<dp[1][0])printf("%d %s\n",dp[1][0],f[1][0]?"No":"Yes");elseprintf("%d No\n",dp[1][0]);initial();cin>>n;}
}
UVA 1220 Hali-Bula的晚会相关推荐
- Uva 1220,Hali-Bula 的晚会
题目链接:https://uva.onlinejudge.org/external/12/1220.pdf 题意: 公司n个人,形成一个数状结构,选出最大独立集,并且看是否是唯一解. 分析: d(i) ...
- Party at Hali-Bula UVA - 1220(树形dp)
题目链接:传送门 思路:求最多参与人数是树形dp的入门题,和没有上司的舞会是一个题目,但是这个题目还要求答案是否唯一.我们开设一个标记数组vis,标记就可以了.具体解释看代码: #include< ...
- uva 1220——Party at Hali-Bula
题意:公司里n个人,要举办一场party,但是到场的人不能碰到他的直隶上司,问最多能到场多少人. 思路:树形dp,就是求在树上的最大独立集合,加唯一性特判.dp(u,0)表示不选u点的条件最大人数,k ...
- UVA 1220 Party at Hali-Bula (树状DP+记忆化搜索)
Dear Contestant, I'm going to have a party at my villa at Hali-Bula to celebrate my retirement from ...
- 【Uva 1220】Party at Hali-Bula
[Link]:https://cn.vjudge.net/contest/170078#problem/M [Description] 求一个树的最大独立子集; (即树的一个点集,这个点集中任意两个点 ...
- Party at Hali-Bula UVA - 1220
https://cn.vjudge.net/problem/UVA-1220 求最大独立集就是裸题 主要是判唯一 dp[i][0]代表不选i的最大独立集 dp[i][1]代表选i book[i][0] ...
- 紫书动规 例题9-13 UVA - 1220 Party at Hali-Bula 树形dp
题目链接: https://vjudge.net/problem/UVA-1220 题意: 题解: 树形dp: 树的最大独立集问题 d[u][0]:=不选u能得到的最大人数 d[u][0]=sum{m ...
- 【学时总结】◆学时·VIII◆ 树形DP
◆学时·VIII◆ 树形DP DP像猴子一样爬上了树--QwQ ◇ 算法概述 基于树的模型,由于树上没有环,满足DP的无后效性,可以充分发挥其强大统计以及计算答案的能力. 一般来说树形DP的状态定义有 ...
- Party at Hali-Bula(树形DP+判断方案数是否唯一)
Party at Hali-Bula UVA - 1220 题意: 公司里有n(n<=200)个人形成一个树状结构, 要求尽量选多的人,但不能同时选择一个人和他的直属上司,文最多能选多少人,以 ...
最新文章
- 王者荣耀服务器维护啥意思,王者荣耀
- JVM 调优实战--jmap的使用以及内存溢出分析
- JNI的一个简单实例
- Axure RP使用攻略--动态面板的用途(8)
- P7888-「MCOI-06」Distinct Subsequences【dp】
- 雪花飞舞的java程序_【图片】请问大神帮我看看一段代码,老是提示空指针异常【java吧】_百度贴吧...
- 淘宝客商城带分销APP源码(原生双端IOS+安卓+后台+数据 库+开发文档),用于学习或二开使用,开发语言:安卓java,苹果oc,后台php。
- c#winform使用EntityFramework导入数据库
- 【转载】Java多线程编程2--同步锁定--synchronized同步方法、脏读、锁重入
- java批量生成pdf
- 2、水晶头制作---网管技能
- LitJson问题汇总
- 网站提示服务器磁盘空间不足,解决服务器磁盘空间不足
- LeetCode-878. 第 N 个神奇数字【数学,二分查找,找规律】
- 使用python中py2neo包连接neo4j(安装,连接,成功解决)
- 【科技与文艺】从星球大战日谈科幻文艺
- java 父类子类有同名方法时如何调用
- 解决在Ubuntu18.04中firefox打开网页出现建立安全失败并提示PR_END_OF_FILE_ERROR
- python图片统一大小及转换通道
- winscp从远程下载文件错误码5