题意:

有一棵树,选出尽可能多的节点是的两两节点不相邻,即每个节点和他的子节点只能选一个。求符合方案的最大节点数,并最优方案判断是否唯一。

分析:

d(u, 0)表示以u为根的子树中,不选u节点能得到的最大人数,f(u, 0)表示方案是否唯一。

d(u, 1)表示选u节点能得到的最大人数,同理,f(u, 1)表示方案是否唯一。

状态的转移:

    • d(u, 1)的计算:因为选了u节点,所以u的子节点都不能选。d(u, 1) = sum{ d(v, 0) | v是u的子节点 }
    • f(u, 1)的计算:当且仅当f(v, 0) == 1时,f(u, 1)才是1
    • d(u, 0)的计算:因为没有选u节点,所以对于每个子节点v可选可不选。d(u, 0) = sum{ max(d(v, 0),  d(v, 1)) }
    • f(u, 0)的计算:方案不唯一有两种情况,某个d(v, 1) == d(v, 0) 或者 对应取到max方案的f为1

这里用了C++中的map,将字符串与编号对应起来,编写代码比较方便。

 //#define LOCAL
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <map>
#include <vector>
#include <iostream>
using namespace std; const int maxn = ;
vector<int> sons[maxn];
map<string, int> dict;
int cnt, d[maxn][], f[maxn][]; int ID(const string& s)
{
if(!dict.count(s)) dict[s] = cnt++;
return dict[s];
} int dp(int u, int k) {
f[u][k] = ;
d[u][k] = k;
for(int i = ; i < sons[u].size(); i++) {
int v = sons[u][i];
if(k == ) { //选节点u
d[u][] += dp(v, );
if(!f[v][]) f[u][] = ; //如果子节点v不唯一,则父节点u也不唯一
} else {
d[u][] += max(dp(v, ), dp(v, ));
if(d[v][] == d[v][]) f[u][k] = ;
else if(d[v][] > d[v][] && !f[v][]) f[u][k] = ;
else if(d[v][] > d[v][] && !f[v][]) f[u][k] = ;
}
}
return d[u][k];
} int main(void)
{
#ifdef LOCAL
freopen("1220in.txt", "r", stdin);
#endif int n;
string s, s2;
while(cin >> n >> s)
{
getchar();
cnt = ;
dict.clear();
for(int i = ; i <= n; ++i) sons[i].clear(); //cin >> s;
ID(s);
for(int i = ; i < n; ++i)
{
cin >> s >> s2;
sons[ID(s2)].push_back(ID(s));
}
printf("%d ", max(dp(, ), dp(, )) );
bool unique = false;
if(d[][] > d[][] && f[][]) unique = true;
if(d[][] > d[][] && f[][]) unique = true;
printf("%s\n", unique ? "Yes" : "No");
} return ;
}

代码君

最新文章

  1. FASTSOCKET
  2. Koala编译less
  3. Win32下 Qt与Lua交互使用(一):配置Qt下Lua运行环境
  4. C#- 布署WinForm程序
  5. ASP.NET中如何生成图形验证码
  6. Configuring the JA-SIG CAS Client --官方
  7. java decompiler如何去掉行号
  8. Dede修改文章默认标题长度,让标题全显示
  9. C# 调用cmd.exe的方法
  10. Linux系统运维工程该具备哪些素质
  11. DB Error || Warning
  12. BZOJ 2329: [HNOI2011]括号修复 [splay 括号]
  13. The type com.google.protobuf.GeneratedMessageV3$Builder cannot be resolved. It is indirectly referenced from required .classfiles
  14. excel表格公式无效、不生效的解决方案及常见问题、常用函数
  15. Kafka consumer group位移0ffset重设
  16. 【1】【leetcode-127】单词接龙word-ladder
  17. GoLang基础数据类型---&gt;字符串处理大全
  18. 12.27 cf div3 解题报告
  19. php四排序-选择排序
  20. Android开发:仿美团下拉列表菜单,帮助类,复用简单

热门文章

  1. java 并发编程
  2. javaZIP压缩文件
  3. Webbrowser 取消下载提示框
  4. 01-05-01-1【Nhibernate (版本3.3.1.4000) 出入江湖】延迟加载及其class和集合(set、bag等)的Lazy属性配置组合对Get和Load方法的影响
  5. mysql 。。。
  6. Ubuntu 下使用Remmina Remote Desktop client 连接windows server输入法的问题
  7. java代码实现自动登录功能
  8. 测试Tomcat
  9. Android:布局单位换算
  10. win32 api ShouCursor 根据内部计数器 是否&gt;= 0 决定是否 显示光标,每true时计数器+1,每false-1