这里的状态定义的非常的巧妙,d(i, 1)表示以i为根节点且选i的子树的最大独立子集

d(i, 0)表示以i为根节点且不选i的子树的最大独立子集

d(i, 1) = sum{ d(v, 0) | v是i的儿子}

d(i, 0) = sum{ max(d(v, 0), d(v, 1)) | v是i的儿子}

答案为 max(d(0, 0), d(0, 1))

至于唯不唯一,很好推,当子树中有一个是不唯一的,那么当前节点就不唯一,或者有两个子树答案是一样的,也是不唯一的。

#include<cstdio>
#include<string>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std; const int MAXN = 212;
vector<int> son[MAXN];
int cnt, d[MAXN][2], f[MAXN][2], n;
map<string, int> id; int ID(string s)
{
if(!id.count(s)) id[s] = cnt++;
return id[s];
} int dp(int u, int k)
{
f[u][k] = 1; d[u][k] = k;
REP(i, 0, son[u].size())
{
int v = son[u][i];
if(k == 1)
{
d[u][k] += dp(v, 0);
if(!f[v][0]) f[u][k] = 0;
}
else
{
d[u][k] += max(dp(v, 1), dp(v, 0));
if(d[v][1] == d[v][0]) f[u][k] = 0;
if(d[v][1] > d[v][0] && !f[v][1]) f[u][k] = 0;
if(d[v][1] < d[v][0] && !f[v][0]) f[u][k] = 0;
}
}
return d[u][k];
} int main()
{
string s, s2;
while(cin >> n >> s)
{
cnt = 0;
id.clear();
REP(i, 0, n) son[i].clear(); ID(s);
REP(i, 0, n - 1)
{
cin >> s >> s2;
son[ID(s2)].push_back(ID(s));
}
printf("%d ", max(dp(0, 0), dp(0, 1))); bool ok = false;
if(d[0][1] > d[0][0] && f[0][1]) ok = true;
if(d[0][1] < d[0][0] && f[0][0] ) ok = true;
printf("%s\n", ok ? "Yes" : "No");
} return 0;
}

最新文章

  1. PHP基础知识第二趴
  2. 购物车数字加减按钮HTML+CSS+JS(有需要嫌麻烦的小伙伴拿走不谢)
  3. mongo 学习笔记
  4. 334. Increasing Triplet Subsequence My Submissions Question--Avota
  5. python基础(三)
  6. 清除Android工程中没用到的资源(转)
  7. Java之路——敬JAVA初学者(作者:MoMo)
  8. c++ 调用dl里的导出类
  9. 深度学习:Keras入门(一)之基础篇
  10. sqlmap命令
  11. 显示 Ubuntu 11.10 的 终端窗口
  12. c# throw和throw ex
  13. http/1.0/1.1/2.0与https的比较
  14. ActiveMQ 填坑记
  15. P1099 树网的核
  16. 23.读懂 ECMAScript 规格
  17. Latex中如何设置字体颜色(3种方式)
  18. mysql-mmm
  19. APUE4.4设置用户ID和设置组ID &amp;&amp; 4.5文件访问权限
  20. iOS开发-UIApplication和App启动状态

热门文章

  1. hadoop-09-安装资源上传
  2. [Angular + TsLint] Disable directive selector tslint error
  3. PHP第九课 正則表達式在PHP中的使用
  4. 在java项目中怎样利用Dom4j解析XML文件获取数据
  5. 【LeetCode-面试算法经典-Java实现】【129-Sum Root to Leaf Numbers(全部根到叶子结点组组成的数字相加)】
  6. 51nod-1322: 关于树的函数
  7. 木马——本质就是cs socket远程控制,反弹木马是作为c端向外发起网络请求
  8. java9新特性-8-语法改进:钻石操作符(Diamond Operator)使用升级
  9. HBase框架基础(一)
  10. 使用tinyxml2库解析xml