这里的状态定义的非常的巧妙,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;
}

紫书 例题 9-13 UVa 1220 (最大独立子集)的更多相关文章

  1. 紫书 例题 11-13 UVa 10735(混合图的欧拉回路)(最大流)

    这道题写了两个多小时-- 首先讲一下怎么建模 我们的目的是让所有点的出度等于入度 那么我们可以把点分为两部分, 一部分出度大于入度, 一部分入度大于出度 那么显然, 按照书里的思路,将边方向后,就相当 ...

  2. 紫书 例题8-3 UVa 1152(中途相遇法)

    这道题要逆向思维, 就是求出答案的一部分, 然后反过去去寻找答案存不存在. 其实很多其他题都用了这道题目的方法, 自己以前都没有发现, 这道题专门考这个方法.这个方法可以没有一直往下求, 可以省去很多 ...

  3. 紫书 例题8-12 UVa 12627 (找规律 + 递归)

    紫书上有很明显的笔误, 公式写错了.g(k, i)的那个公式应该加上c(k-1)而不是c(k).如果加上c(k-1)那就是这一次 所有的红气球的数目, 肯定大于最下面i行的红气球数 我用的是f的公式, ...

  4. 紫书 例题8-4 UVa 11134(问题分解 + 贪心)

     这道题目可以把问题分解, 因为x坐标和y坐标的答案之间没有联系, 所以可以单独求两个坐标的答案 我一开始想的是按照左区间从小到大, 相同的时候从右区间从小到大排序, 然后WA 去uDebug找了数据 ...

  5. 紫书 例题8-17 UVa 1609 (构造法)(详细注释)

    这道题用构造法, 就是自己依据题目想出一种可以得到解的方法, 没有什么规律可言, 只能根据题目本身来思考. 这道题的构造法比较复杂, 不知道刘汝佳是怎么想出来的, 我想的话肯定想不到. 具体思路紫书上 ...

  6. 紫书 例题 9-5 UVa 12563 ( 01背包变形)

    总的来说就是价值为1,时间因物品而变,同时注意要刚好取到的01背包 (1)时间方面.按照题意,每首歌的时间最多为t + w - 1,这里要注意. 同时记得最后要加入时间为678的一首歌曲 (2)这里因 ...

  7. 紫书 例题 10-2 UVa 12169 (暴力枚举)

    就是暴力枚举a, b然后和题目给的数据比较就ok了. 刘汝佳这道题的讲解有点迷,书上讲有x1和a可以算出x2, 但是很明显x2 = (a * x1 +b) 没有b怎么算x2?然后我就思考了很久,最后去 ...

  8. 紫书 例题 10-26 UVa 11440(欧拉函数+数论)

    这里用到了一些数论知识 首先素因子都大于M等价与M! 互质 然后又因为当k与M!互质且k>M!时当且仅当k mod M! 与M!互质(欧几里得算法的原理) 又因为N>=M, 所以N!为M! ...

  9. 紫书 例题8-2 UVa 11605(构造法)

    这道题方法非常的巧妙, 两层的n*n, 第一层第I行全是第I个国家, 第二层的第j列全是第j个国家.这样能符合题目的条件.比如说第1个国家, 在第一层的第一行全是A, 然后在第二层的第一行就有ABCD ...

随机推荐

  1. 转--配置linux下dircolors,ls命令和mac下iTerm2的颜色,让终端(iTerm2或Terminal)也色彩缤纷

    http://blog.bbkanba.com/%E9%85%8D%E7%BD%AElinux%E4%B8%8Bdircolorsls%E5%91%BD%E4%BB%A4%E5%92%8Cmac%E4 ...

  2. 用html语言写一个功课表

    今天在网上看了一个关于html的教程,主要是讲表格,看完之后认为有必要上机试试.于是就写了以下的一段代码. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb ...

  3. js html 事件冒泡

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  4. windows下git的安装和使用

    git到底是个什么东西,我这里就不介绍了,如果大家还有不懂的,可以去百度一下的.我这里给一个介绍的网址:git简介        这里在留一个地址http://baike.baidu.com/subv ...

  5. 43.$http

    转自:https://www.cnblogs.com/best/tag/Angular/ $http 是 AngularJS 中的一个核心服务,用于读取远程服务器的数据. 使用格式: // 简单的 G ...

  6. Struts2标签库整理【完整】

    转自:https://blog.csdn.net/chen_zw/article/details/8161230   Struts2标签库提供了主题.模板支持,极大地简化了视图页面的编写,而且,str ...

  7. GPU学习笔记(二)

    找到了一个还不错的教程http://blog.csdn.net/augusdi/article/details/12527497 今天课比较多,但是有了这个教程解决了昨天不能运行的问题.

  8. 最近Criteria

    第一次用Criteria,于是查了一下http://langgufu.iteye.com/blog/2039554 新鲜事排序算法http://www.zhihu.com/question/20319 ...

  9. PHP接收GET中文参数乱码的原因及解决方案

    方案1: $str = iconv("gb2312","utf-8",$str); 方案2: mb_convert_encoding($str, "u ...

  10. JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jstat(复制)

    jstack -- 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程 ...