dp[u][0]表示不选u时在以u为根的子树中最大人数,dp[u][1]则是选了u后的最大人数;

f[u][0]表示不选u时的唯一性,f[u][1]是选了u后的唯一性,值为1代表唯一,0代表不唯一。

当不选u时,u的子节点v可选可不选,dp[u][0]+=max(dp[v][0],dp[v][1]),再根据所选判断f[u][0];

当选u时,u的子节点都不可选,dp[u][1]+=dp[v][0],再判断f[u][1];

在这里可以用map将人名映射为数字,map<string,int> mp 。

  1. 1 #include<iostream>
  2. 2 #include<cstdio>
  3. 3 #include<algorithm>
  4. 4 #include<string>
  5. 5 #include<cstring>
  6. 6 #include<map>
  7. 7 #include<vector>
  8. 8 using namespace std;
  9. 9 int dp[210][2],f[210][2];
  10. 10 vector<int>E[210];
  11. 11
  12. 12 void dfs(int u){
  13. 13 dp[u][0]=0;
  14. 14 dp[u][1]=1;
  15. 15 for(int i=0;i<E[u].size();i++){
  16. 16 int v=E[u][i];
  17. 17 dfs(v);
  18. 18 if(dp[v][0]==dp[v][1]){
  19. 19 dp[u][0]+=dp[v][0];
  20. 20 f[u][0]=0;
  21. 21 }
  22. 22 else if(dp[v][0]>dp[v][1]){
  23. 23 dp[u][0]+=dp[v][0];
  24. 24 if(!f[v][0]) f[u][0]=0;
  25. 25 }
  26. 26 else{
  27. 27 dp[u][0]+=dp[v][1];
  28. 28 if(!f[v][1]) f[u][0]=0;
  29. 29 }
  30. 30 dp[u][1]+=dp[v][0];
  31. 31 if(!f[v][0]) f[u][1]=0;
  32. 32 }
  33. 33 }
  34. 34
  35. 35 int main(){
  36. 36 int n,k;
  37. 37 string s1,s2;
  38. 38 map<string,int> mp;//将字符串映射为数字
  39. 39 while(cin>>n&&n){
  40. 40 mp.clear();
  41. 41 for(int i=0;i<=n;i++) E[i].clear(); //清空
  42. 42 memset(f,1,sizeof(f));//初始都设为唯一
  43. 43 k=1;
  44. 44 cin>>s1;
  45. 45 mp[s1]=k++;
  46. 46 E[0].push_back(mp[s1]);//增加超根
  47. 47 for(int i=1;i<=n-1;i++){
  48. 48 cin>>s1>>s2;
  49. 49 if(mp[s1]==0) mp[s1]=k++;
  50. 50 if(mp[s2]==0) mp[s2]=k++;
  51. 51 E[mp[s2]].push_back(mp[s1]);
  52. 52 }
  53. 53 dfs(0);//从根开始遍历
  54. 54 printf("%d ",dp[0][0]);
  55. 55 if(f[0][0]) printf("Yes\n");
  56. 56 else printf("No\n");
  57. 57 }
  58. 58 return 0;
  59. 59 }

POJ3342 Party at Hali-Bula(树形DP)的更多相关文章

  1. poj3417 LCA + 树形dp

    Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4478   Accepted: 1292 Descripti ...

  2. COGS 2532. [HZOI 2016]树之美 树形dp

    可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...

  3. 【BZOJ-4726】Sabota? 树形DP

    4726: [POI2017]Sabota? Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 128  Solved ...

  4. 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)

    题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...

  5. 树形DP

    切题ing!!!!! HDU  2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...

  6. BZOJ 2286 消耗战 (虚树+树形DP)

    给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...

  7. POJ2342 树形dp

    原题:http://poj.org/problem?id=2342 树形dp入门题. 我们让dp[i][0]表示第i个人不去,dp[i][1]表示第i个人去 ,根据题意我们可以很容易的得到如下递推公式 ...

  8. hdu1561 The more, The Better (树形dp+背包)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1561 思路:树形dp+01背包 //看注释可以懂 用vector建树更简单. 代码: #i ...

  9. bzoj2500: 幸福的道路(树形dp+单调队列)

    好题.. 先找出每个节点的树上最长路 由树形DP完成 节点x,设其最长路的子节点为y 对于y的最长路,有向上和向下两种情况: down:y向子节点的最长路g[y][0] up:x的次长路的g[x][1 ...

随机推荐

  1. 标准的Switch语句和穿透的Switch语句

    第三章 选择语句 3.1选择语句--Switch switch语句格式: ```java switch(表达式){ case 常量值1: 语句体1; break; case 常量值2: 语句体2; b ...

  2. 基于Python3(Autosub)以及Ffmpeg配合GoogleTranslation(谷歌)为你的影片实现双语版字幕(逐字稿)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_169 为影片加字幕其实是一件非常耗费时间的事情,尤其是对于打字慢的朋友来说.当然不光为影片加字幕,在其他领域,类似的逐字稿也是工作 ...

  3. Odoo14 groups && rule

    # Odoo14 groups && rule # admin账户以及权限的来源: # admin创建代码在:odoo/odoo/addons/base/data/res_users_ ...

  4. Java学习 (八)基础篇 运算符

    目录 运算符 基本运算符 1.一元基础运算(重点) 一元运算符 (a++ / ++a) (a-- / --a) 2.二元基础运算 基础 计算返回值类型 关系运算 幂运算 3.三元运算符 4.逻辑运算符 ...

  5. 5.8 NOI 模拟

    \(T1\) 比较容易想到的 二分转化为判定,判定是否存在一个子图能保证能一直在\(x\)时间内到达\(n\) 设\(dis(u,v)\)表示\(u->v\)的最短路 先找出候选节点\(i,di ...

  6. 巧用Prometheus来扩展kubernetes调度器

    Overview 本文将深入讲解 如何扩展 Kubernetes scheduler 中各个扩展点如何使用,与扩展scheduler的原理,这些是作为扩展 scheduler 的所需的知识点.最后会完 ...

  7. [CSharpTips]判断两条线段是否相交

    判断两条线段是否相交 主要用到了通过向量积的正负判断两个向量位置关系 向量a×向量b(×为向量叉乘),若结果小于0,表示向量b在向量a的顺时针方向:若结果大于0,表示向量b在向量a的逆时针方向:若等于 ...

  8. 2019 CSP-S Ⅱ 游记

    day0(试机) 第零天,重新打了一遍头文件和读优,熟悉了一下就匆匆走了. day1 T1一看到先把二分打了,然后发现long long要爆,好慌 主要是基础知识不够扎实,不知道unsigned lo ...

  9. window桌面背景图片

    通过修改注册表项: \HKEY_CURRENT_USER\Control Panel\Desktop下的几个值,及可以将我们想要的图片设置成桌面的背景图 TileWallpaper   Wallpap ...

  10. Python入门系列(一)安装环境

    python是什么 python是一门很受欢迎的语言,除了不能生孩子以外,其它都可以做. 它擅长的领域是脚本工具和科学数据这一块,比如大数据,数据分析什么的. python安装 为了演示和验证教程可用 ...