题意是挑选尽量多的人,并且每个人都不和他的父节点同时出现,很明显的最大独立集问题,难点在于如何判断方案是否唯一。

详情请见刘汝佳《算法竞赛入门经典--第二版》P282

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#include<cmath>
#include<queue>
#define INF 1e6
using namespace std;
const int maxn = ; char ch[],fa[];
char trie[maxn][];
int k;
int d[maxn][],f[maxn][];
vector<int> g[maxn]; int ID(char *s)//给每个字符串分配ID;
{
int i = ;
for(i = ; i < k; ++i)
{
if(strcmp(s,trie[i]) == ) {
return i;
}
}
if(i == k) strcpy(trie[k],s);
k++;
return k-;
}
int dp(int u,int x)
{
if(d[u][x]!=-) return d[u][x];//记忆化
if(x == ){
int sum = ;
f[u][] = ;
if(g[u].size() == ) return d[u][] = ;
for(int i = ; i < g[u].size(); ++i)
{
sum+=dp(g[u][i],);
if(f[g[u][i]][] == ) {
f[u][] = ;
}
}
return d[u][] = sum;
}
else
{
int sum = ;
f[u][] = ;
if(g[u].size() == ) return d[u][] = ;
for(int i = ; i < g[u].size(); ++i)
{
int p = dp(g[u][i],),q = dp(g[u][i],);
if(p == q)
{
sum+=p;
f[u][] = ;
}
else if(p > q)
{
sum+=p;
if(f[g[u][i]][] == ) f[u][] = ;
}
else if(p < q)
{
sum+=q;
if(f[g[u][i]][] == ) f[u][] = ;
}
}
return d[u][] = sum;
}
}
int main()
{
//freopen("in","r",stdin);
int n;
while(~scanf("%d",&n)&&n)
{
int from,to;
k = ;
scanf("%s",ch);
ID(ch);//big boss是0号
for(int i = ; i < n; ++i)
{
scanf("%s%s",ch,fa);
from = ID(ch);
to = ID(fa);
g[to].push_back(from);
}
//printf("%d\n",g[0].size());
memset(d,-,sizeof(d));
dp(,);
dp(,);
if(d[][] > d[][])
{
printf("%d ",d[][]);
if(f[][]) puts("Yes");
else puts("No");
}
else if(d[][] < d[][])
{
printf("%d ",d[][]);
if(f[][]) puts("Yes");
else puts("No");
}
else
{
printf("%d ",d[][]);
puts("No");
}
for(int i = ; i < n; ++i) g[i].clear(); }
}

uva1220--树的最大独立集+判重的更多相关文章

  1. POJ 3342 Party at Hali-Bula (树形dp 树的最大独立集 判多解 好题)

    Party at Hali-Bula Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5660   Accepted: 202 ...

  2. 八数码问题+路径寻找问题+bfs(隐式图的判重操作)

    Δ路径寻找问题可以归结为隐式图的遍历,它的任务是找到一条凑够初始状态到终止问题的最优路径, 而不是像回溯法那样找到一个符合某些要求的解. 八数码问题就是路径查找问题背景下的经典训练题目. 程序框架 p ...

  3. UVa 1220 Hali-Bula的晚会(树的最大独立集)

    https://vjudge.net/problem/UVA-1220 题意: 公司里有n个人形成一个树状结构,即除了老板以外每个员工都有唯一的直属上司.要求选尽量多的人,但不能同时选择一个人和他的直 ...

  4. 程序员的算法课(14)-Hash算法-对海量url判重

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/de ...

  5. BFS+Hash(储存,判重) HDOJ 1067 Gap

    题目传送门 题意:一个图按照变成指定的图,问最少操作步数 分析:状态转移简单,主要是在图的存储以及判重问题,原来队列里装二维数组内存也可以,判重用神奇的hash技术 #include <bits ...

  6. 洛谷 P1379 八数码难题 Label:判重&&bfs

    特别声明:紫书上抄来的代码,详见P198 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给 ...

  7. poj 1465 Multiple(bfs+余数判重)

    题意:给出m个数字,要求组合成能够被n整除的最小十进制数. 分析:用到了余数判重,在这里我详细的解释了.其它就没有什么了. #include<cstdio> #include<cma ...

  8. POJ 3668 Game of Lines (暴力,判重)

    题意:给定 n 个点,每个点都可以和另一个点相连,问你共有多少种不同斜率的直线. 析:那就直接暴力好了,反正数也不大,用set判重就好,注意斜率不存在的情况. 代码如下: #include <c ...

  9. UVa 10400 - Game Show Math 游戏中的数学 dfs+判重

    题意:给出一些数字和一个目标数字,要求你在数字间添加+-*/,让表达式能达到目标数字,运算符号的优先级都是一样的. 由于数据量很大,本来想用map<string>判重的,结果还是超时了,然 ...

随机推荐

  1. php面向对象编程之构造方法__construct()

    php中构造方法是对象创建完成后第一个被对象自动调用的方法.在每个类中都有一个构造方法,如果没有显示地声明它,那么类中都会默认存在一个没有参数且内容为空的构造方法. 构造方法的作用 通常构造方法被用来 ...

  2. 第28讲 UI组件之 ListView和ArrayAdapter

    第28讲 UI组件之 ListView和ArrayAdapter 1. Adapter 适配器 Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带.在常见的 ...

  3. log4j 突然不打印记录,提示:No appenders could be found for logge,处理方法

    log4j 一直都在使用正常,log4j.xml配置.代码都没有修改,突然不打印记录,出现下面提示: log4j:WARN No appenders could be found for logger ...

  4. jsonp+handler 的实现

    //参考 http://www.cnblogs.com/yuwensong/archive/2013/05/28/3103064.html 后台: public void ProcessRequest ...

  5. unity3d 学习笔记(一)

    操作:按下shit 点击坐标轴中心 切换透视图 动画烘焙的概念:相当于把原来的控制器动画或者IK(骨骼)动画所有塌陷为逐帧动画,导出的时候必须选这一项 着色器:从技术的角度来看,着色器是渲染器的一个部 ...

  6. 多路复用I/O epoll()

    epoll 是Linux内核中的一种可扩展IO事件处理机制,最早在 Linux 2.5.44内核中引入,可被用于代替POSIX select 和 poll 系统调用,并且在具有大量应用程序请求时能够获 ...

  7. linux提取指定行至指定位置

    grep查找ERROR,定位位置 awk打印到指定行数 sed打印到文本末尾 awk打印到文本末尾 方法一 #!/bin/csh -f if(-f errorlog.rpt) then rm -rf ...

  8. 使用 Fluent API 配置/映射属性和类型2

    1.将多个实体类映射到数据库中的一个表 要将多个实体映射到一个数据库表需要满足: a. 两个实体必须是一对一关系 b.两个实体共享一个主键 public class MyContext:DbConte ...

  9. (转).net程序员转战android第二篇---牛刀小试

    上篇说道如何搭建android的开发环境,这一篇我们将牛刀小试一下, 完成我们第一个android APP应用. 我就从新建项目说起吧. 首先打开Eclipse,选择顶部的File(文件)——new( ...

  10. Java数据结构漫谈-ArrayList

    ArrayList是一个基于数组实现的链表(List),这一点可以从源码中看出: transient Object[] elementData; // non-private to simplify ...