uva1220--树的最大独立集+判重
题意是挑选尽量多的人,并且每个人都不和他的父节点同时出现,很明显的最大独立集问题,难点在于如何判断方案是否唯一。
详情请见刘汝佳《算法竞赛入门经典--第二版》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--树的最大独立集+判重的更多相关文章
- POJ 3342 Party at Hali-Bula (树形dp 树的最大独立集 判多解 好题)
Party at Hali-Bula Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5660 Accepted: 202 ...
- 八数码问题+路径寻找问题+bfs(隐式图的判重操作)
Δ路径寻找问题可以归结为隐式图的遍历,它的任务是找到一条凑够初始状态到终止问题的最优路径, 而不是像回溯法那样找到一个符合某些要求的解. 八数码问题就是路径查找问题背景下的经典训练题目. 程序框架 p ...
- UVa 1220 Hali-Bula的晚会(树的最大独立集)
https://vjudge.net/problem/UVA-1220 题意: 公司里有n个人形成一个树状结构,即除了老板以外每个员工都有唯一的直属上司.要求选尽量多的人,但不能同时选择一个人和他的直 ...
- 程序员的算法课(14)-Hash算法-对海量url判重
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/de ...
- BFS+Hash(储存,判重) HDOJ 1067 Gap
题目传送门 题意:一个图按照变成指定的图,问最少操作步数 分析:状态转移简单,主要是在图的存储以及判重问题,原来队列里装二维数组内存也可以,判重用神奇的hash技术 #include <bits ...
- 洛谷 P1379 八数码难题 Label:判重&&bfs
特别声明:紫书上抄来的代码,详见P198 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给 ...
- poj 1465 Multiple(bfs+余数判重)
题意:给出m个数字,要求组合成能够被n整除的最小十进制数. 分析:用到了余数判重,在这里我详细的解释了.其它就没有什么了. #include<cstdio> #include<cma ...
- POJ 3668 Game of Lines (暴力,判重)
题意:给定 n 个点,每个点都可以和另一个点相连,问你共有多少种不同斜率的直线. 析:那就直接暴力好了,反正数也不大,用set判重就好,注意斜率不存在的情况. 代码如下: #include <c ...
- UVa 10400 - Game Show Math 游戏中的数学 dfs+判重
题意:给出一些数字和一个目标数字,要求你在数字间添加+-*/,让表达式能达到目标数字,运算符号的优先级都是一样的. 由于数据量很大,本来想用map<string>判重的,结果还是超时了,然 ...
随机推荐
- hdu3415:最大k子段和,单调队列
题目大意:给定长度为n的数组,求出最大的区间和,其中区间长度在[1,k]之间 分析: 学动态规划的时候我们会遇到一个经典问题 最大子段和,这个题跟最大子段和很类似 不同的是区间的长度有限制,无法用原算 ...
- html5 手机APP计算高度问题
安卓手机型号比较多,会出现bottom:0 找不到底部的问题,所以需要计算手机可视区域高度,这样便于使用百分比适配 (function(window,undefined){ /** * js_heig ...
- js基础例子购物车升级版(未优化版)
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- ngui点击与场景点击判断
注:NGUI 组件上加上 BoxCollider 并设置区域大小 public void OnMouseDown() { if (UICamera.hoveredObject == null) ...
- [转]iOS开发使用半透明模糊效果方法整理
转自:http://www.molotang.com/articles/1921.html 虽然iOS很早就支持使用模糊效果对图片等进行处理,但尤其在iOS7以后,半透明模糊效果得到大范围广泛使用.包 ...
- gstreamer让playbin能够播放rtp over udp流数据
最近一段时间在研究传屏低延迟传输相关的一些东西.本来想使用gstreamer来验证下rtp over udp传送h264 nal数据相关 的,结果发现竟然不能用playbin来播放rtp的数据!诚然, ...
- CodeSmith使用总结--下拉列表和文件夹对话框属性
上一篇有点短了,因为实在没有什么可说的,这一篇会多一点.O(∩_∩)O~ 一.下拉列表 关于如何在CodeSmith中创建一个下拉列表的属性框其实很简单,是要使用C#中的枚举就行了,看操作. 首先定义 ...
- WebApi2官网学习记录--- Authentication与Authorization
Authentication(认证) WebAPI中的认证既可以使用HttpModel也可以使用HTTP message handler,具体使用哪个可以参考一下依据: 一个HttpModel可以 ...
- Java数据输入
以下是数据输入实例: //以下是数据输入实例 import java.util.Scanner;//导入java.util.Scanner,Scanner首字母大写 public class Test ...
- linux环境下jdk 安装以及maven私服搭建
1:准备资源 linux服务器,jdk和nexus 安装包 2:网络通畅,保持windows端和linux服务器端网络通畅. 3: 安装jdk和配置环境变量 进入到 ...