题目描述: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的晚会相关推荐

  1. Uva 1220,Hali-Bula 的晚会

    题目链接:https://uva.onlinejudge.org/external/12/1220.pdf 题意: 公司n个人,形成一个数状结构,选出最大独立集,并且看是否是唯一解. 分析: d(i) ...

  2. Party at Hali-Bula UVA - 1220(树形dp)

    题目链接:传送门 思路:求最多参与人数是树形dp的入门题,和没有上司的舞会是一个题目,但是这个题目还要求答案是否唯一.我们开设一个标记数组vis,标记就可以了.具体解释看代码: #include< ...

  3. uva 1220——Party at Hali-Bula

    题意:公司里n个人,要举办一场party,但是到场的人不能碰到他的直隶上司,问最多能到场多少人. 思路:树形dp,就是求在树上的最大独立集合,加唯一性特判.dp(u,0)表示不选u点的条件最大人数,k ...

  4. 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 ...

  5. 【Uva 1220】Party at Hali-Bula

    [Link]:https://cn.vjudge.net/contest/170078#problem/M [Description] 求一个树的最大独立子集; (即树的一个点集,这个点集中任意两个点 ...

  6. Party at Hali-Bula UVA - 1220

    https://cn.vjudge.net/problem/UVA-1220 求最大独立集就是裸题 主要是判唯一 dp[i][0]代表不选i的最大独立集 dp[i][1]代表选i book[i][0] ...

  7. 紫书动规 例题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 ...

  8. 【学时总结】◆学时·VIII◆ 树形DP

    ◆学时·VIII◆ 树形DP DP像猴子一样爬上了树--QwQ ◇ 算法概述 基于树的模型,由于树上没有环,满足DP的无后效性,可以充分发挥其强大统计以及计算答案的能力. 一般来说树形DP的状态定义有 ...

  9. Party at Hali-Bula(树形DP+判断方案数是否唯一)

    Party at Hali-Bula UVA - 1220 题意:  公司里有n(n<=200)个人形成一个树状结构, 要求尽量选多的人,但不能同时选择一个人和他的直属上司,文最多能选多少人,以 ...

最新文章

  1. 王者荣耀服务器维护啥意思,王者荣耀
  2. JVM 调优实战--jmap的使用以及内存溢出分析
  3. JNI的一个简单实例
  4. Axure RP使用攻略--动态面板的用途(8)
  5. P7888-「MCOI-06」Distinct Subsequences【dp】
  6. 雪花飞舞的java程序_【图片】请问大神帮我看看一段代码,老是提示空指针异常【java吧】_百度贴吧...
  7. 淘宝客商城带分销APP源码(原生双端IOS+安卓+后台+数据 库+开发文档),用于学习或二开使用,开发语言:安卓java,苹果oc,后台php。
  8. c#winform使用EntityFramework导入数据库
  9. 【转载】Java多线程编程2--同步锁定--synchronized同步方法、脏读、锁重入
  10. java批量生成pdf
  11. 2、水晶头制作---网管技能
  12. LitJson问题汇总
  13. 网站提示服务器磁盘空间不足,解决服务器磁盘空间不足
  14. LeetCode-878. 第 N 个神奇数字【数学,二分查找,找规律】
  15. 使用python中py2neo包连接neo4j(安装,连接,成功解决)
  16. 【科技与文艺】从星球大战日谈科幻文艺
  17. java 父类子类有同名方法时如何调用
  18. 解决在Ubuntu18.04中firefox打开网页出现建立安全失败并提示PR_END_OF_FILE_ERROR
  19. python图片统一大小及转换通道
  20. winscp从远程下载文件错误码5

热门文章

  1. docker映射端口
  2. 阿里云 安装mysql
  3. idlemystic区块链卡牌游戏|附教程和收益
  4. 2022中国电子学会青少年软件编程C语言一级测试题
  5. 演义江湖PC端意见汇总
  6. 什么是存货周转天数,有什么作用
  7. 国内知名前端大佬收集(排名不分先后)
  8. Android12之OpenSL ES衔接android侧播放器(十六)
  9. perl chop和chomp函数区别
  10. gen-和-egen-中的-sum()-函数