有 n 个员工,n-1个从属关系。

不能同时选择某个员工和他的直接上司,问最多可以选多少人,以及选法是否唯一。

树上的最大独立集问题。只不过多了一个判断唯一性。

dp[u][0]表示不选这个点的状态,dp[u][1]表示选这个点的状态。

如果不选 u, 那么 u点状态是由 dp[v][0] 或者 dp[v][1],大的那个点转移过来,唯一性同时也转移。

如果选 u , 那么 u点状态是由所有的 dp[v][0] 转移过来,所以只有所有的 dp[v][0]状态的都唯一时,dp[u][1]才唯一。

另外,我一直 WA 的原因在于给员工编号的时候没有判断有没有出现过,默认每行的第一个都是没有出现过的。瞎改了好久。

吸取教训。

#include <bits/stdc++.h>
using namespace std;
#define maxn 100010 vector<int> son[maxn], fa[maxn];
int same[maxn], dp[maxn][], f[maxn][]; void DP(int k)
{
dp[k][] = , dp[k][] = ; f[k][] = , f[k][] = ;
for (int i = ; i < son[k].size(); i++)
{
int v = son[k][i];
DP(v); dp[k][] += max(dp[v][], dp[v][]); if (dp[v][] == dp[v][]) f[k][] = ;
if (dp[v][] > dp[v][] && f[v][] == ) f[k][] = ;
if (dp[v][] < dp[v][] && f[v][] == ) f[k][] = ; dp[k][] += dp[v][];
if (f[v][] == ) f[k][] = ;
}
} void init(int n)
{
for (int i = ; i < n; i++)
son[i].clear();
memset(f, , sizeof());
} int main()
{
int n;
while(~scanf("%d", &n) && n)
{
init(n);
map<string, int> idx;
string s;
cin >> s;
idx[s] = ;
int id = ; for (int i = ; i <= n-; i++)
{
string x, y;
cin >> x >> y;
if (!idx.count(x))
idx[x] = ++id;
if (!idx.count(y))
idx[y] = ++id;
son[idx[y]].push_back(idx[x]);
} DP(); int uniq = ;
if (dp[][] > dp[][] && f[][] == ) uniq = ;
else if (dp[][] < dp[][] && f[][] == ) uniq = ;
else if (dp[][] == dp[][]) uniq = ; printf("%d %s\n", max(dp[][], dp[][]), uniq ? "Yes":"No");
}
}

最新文章

  1. js日期校验
  2. ng-switch 指令
  3. 浅析Java异常
  4. iOS传值方式:属性,代理,block,单例,通知
  5. 11.2 afternoon
  6. url的三个js编码函数escape(),encodeURI(),encodeURIComponent()简介
  7. java Object 类
  8. gvim生存配置
  9. Android 增加(键盘)按键
  10. Jupyter Notebook的快捷键
  11. [Swift]LeetCode203. 移除链表元素 | Remove Linked List Elements
  12. CF1101F Trucks and Cities
  13. Effective C++ 条款46
  14. SpringBoot中配置起动时的数据库初始化角本
  15. sql update操作结果
  16. 【JavaScript】js 中一些需要注意的问题
  17. idea输入法候选区不跟随光标
  18. 读取GY-951模块数据(Linux)
  19. Android SharedPreferences保存第一次的信息
  20. 《Linux内核设计与实现》第5章读书笔记

热门文章

  1. (转)Centos 7.3 用户和组管理
  2. RabbitMQ使用教程(二)RabbitMQ用户管理,角色管理及权限设置
  3. scp 可以在 2个 linux 主机间复制文件
  4. Linux学习笔记——如何使用echo指令向文件写入内容
  5. T-SQL查询处理执行顺序(一)
  6. 一起来学Spring Cloud | 第四章:服务消费者 ( Feign )
  7. 前端HTML以及HTML5(基本标签)
  8. document.all.item作用
  9. mininet安装,使用
  10. CF Gym 100637F The Pool for Lucky Ones