HNOI2006 潘多拉的盒子
题目描述
题解:
题目的描述比较长,理解起来也有一定难度。仔细读题后我们发现整个任务可以分成两个部分:找出咒语机之间所有的升级关系、求最长升级序列。
1、 求升级关系:
容易看出,咒语机i可以抽象成一个图Gi,其顶点集Vi为ni个元件,每个顶点发出两条边——“0”边和“1”边,分别表示将信号加“0”和加“1”。
我们枚举两个咒语机A、B(A≠B),判断B是否是A的升级。最简单的想法是生成出A和B的所有咒语源,然后判断前者是否为后者的子集。但是,一个咒语机产生的咒语源可能有无限多个,无法逐一判断。
其实,只要存在一个咒语源,A能够产生而B不能产生,那么这一升级关系就不成立。为了找到(或者证明不存在)这样的一个咒语源,我们构造图H,其顶点是一个二元组(i,j),表示图GA的顶点i和图GB的顶点j。如果图GA的顶点i走“c”边到达顶点ic(c=0,1),图GB的顶点j走“c”边到达顶点jc,那么从图H的顶点(i,j)连有向边到(ic,jc)。我们将图H中的某些顶点(i,j)称为“关键顶点”,其特点是:图GA的顶点i是输出元而图GB的顶点j不是输出元。存在一个A能够产生而B不能的咒语源,等价于图H中存在从顶点(0,0)到关键顶点的路径。我们只需用广度优先搜索遍历图H即可。
2、 求最长升级序列:
假设第1部分求出的升级关系保存在图G中:如果咒语机B是A的升级,那么图G中从A向B连一条有向边。最长升级序列在图中对应最长路经。如果G是有向无环图,那么可以用拓扑排序加上动态规划的方法求最长路径。可惜的是,G有可能存在环,并且只有一种可能:存在若干个咒语机,它们产生的咒语源完全相同。显然,在这种情况下,只要选择其中一个,那么与之相同的所有咒语机都可以被选择。因此,我们把图中所有相同的咒语机合并成一个结点,并用num域记录该结点是由多少个结点合并而来(如图1)。
这样,问题转化为在一个有向无环图中求带权最长路经,这同样可以用拓扑排序加上动态规划的方法解决。具体的方法是:首先将图的顶点重新编号使得1,2,…,n是图的拓扑序,然后利用状态转移方程求解即可。
以上两个部分中,第一部分的时间复杂度为O(n2s2),第二部分的时间复杂度为O(s2),所以算法的总时间复杂度为O(n2s2)。
代码:
#include<queue> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 55; int s; struct node {int n,m;bool ot[N];int ch[N][2];void read(){scanf("%d%d",&n,&m);for(int a,i=1;i<=m;i++){scanf("%d",&a);ot[a]=1;}for(int i=0;i<n;i++){scanf("%d%d",&ch[i][0],&ch[i][1]);}} }p[N]; int hed[N],cnt; struct EG {int fr,to,nxt; }e[N*N],e0[N*N]; void ae(int f,int t) {e[++cnt].fr = f;e[cnt].to = t;e[cnt].nxt = hed[f];hed[f] = cnt; } struct Pair {int x,y;Pair(){}Pair(int x,int y):x(x),y(y){} }; bool vs[N][N]; bool check(node &a,node &b) {memset(vs,0,sizeof(vs));queue<Pair>q;q.push(Pair(a.ch[0][0],b.ch[0][0]));q.push(Pair(a.ch[0][1],b.ch[0][1]));while(!q.empty()){Pair u = q.front();q.pop();if(!a.ot[u.x]&&b.ot[u.y])return 0;if(vs[u.x][u.y])continue;vs[u.x][u.y]=1;q.push(Pair(a.ch[u.x][0],b.ch[u.y][0]));q.push(Pair(a.ch[u.x][1],b.ch[u.y][1]));}return 1; } int dep[N],low[N],tot; bool vis[N]; int bel[N],bc,siz[N],sta[N],tl; void tarjan(int u) {dep[u]=low[u]=++tot;vis[u]=1;sta[++tl] = u;for(int j=hed[u];j;j=e[j].nxt){int to = e[j].to;if(!dep[to]){tarjan(to);low[u] = min(low[u],low[to]);}else if(vis[to]){low[u] = min(low[u],dep[to]);}}if(dep[u]==low[u]){bc++;int c = -1;while(c!=u){c = sta[tl--];bel[c]=bc;siz[bc]++;vis[c] =0;}} } bool eg[N][N]; int Hed[N],Cnt; void AE(int f,int t) {e0[++Cnt].to = t;e0[Cnt].nxt = Hed[f];Hed[f] = Cnt; } int dp[N]; int dfs(int u) {if(dp[u])return dp[u];if(!Hed[u])return dp[u]=siz[u];for(int j=Hed[u];j;j=e0[j].nxt)dp[u]=max(dp[u],dfs(e0[j].to)+siz[u]);return dp[u]; } int main() { // freopen("pandora.in","r",stdin); // freopen("pandora.out","w",stdout);scanf("%d",&s);for(int i=1;i<=s;i++)p[i].read();for(int i=1;i<=s;i++)for(int j=1;j<=s;j++)if(i!=j&&check(p[i],p[j]))ae(i,j);for(int i=1;i<=s;i++)if(!dep[i])tarjan(i);for(int j=1;j<=cnt;j++){int f = bel[e[j].fr],t = bel[e[j].to];if(f!=t&&!eg[f][t])eg[f][t]=1,AE(f,t);}int ans = 0;for(int i=1;i<=bc;i++)ans=max(ans,dfs(i));printf("%d\n",ans);return 0; }
转载于:https://www.cnblogs.com/LiGuanlin1124/p/10304762.html
HNOI2006 潘多拉的盒子相关推荐
- bzoj1194 [HNOI2006]潘多拉的盒子
http://www.elijahqi.win/archives/3189 Description 传说中,有个神奇的潘多拉宝盒.如果谁能打开,便可以拥有幸福.财富.爱情.可是直到真的打开,才发现与之 ...
- BZOJ 1194: [HNOI2006]潘多拉的盒子 [DP DFA]
传送门 题意: s个DFA,选出尽量多的自动机a0, a1, a2, . . . , at,使得a1包含a0.a2包 含a1,以此类推.s ≤ 50. DFA的字符集为{0,1},有的节点是输出源,节 ...
- 【BZOJ-1194】潘多拉的盒子 拓扑排序 + DP
1194: [HNOI2006]潘多拉的盒子 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 456 Solved: 215 [Submit][St ...
- 第16章 潘多拉的盒子
在分班后的高二上半学期的期末,孙斌新忽然不想上学了,想去当兵.我们不明白是什么导致他会有这样的想法.是因为高中的压力吗,还是适应不了这炼狱般的生活呢?我们不知道,知道的只是孙斌新在期末考完回家的路上, ...
- 专访李开复:人类已打开潘多拉盒子,封堵AI变革只会徒劳
来源:人工智能学家 本文约3623字,建议阅读6分钟. 我们对李开复进行了专访,谈到了众多当前AI领域最受关注的话题. 摘要:近期,李开复新书<AI·未来>在美国同样反响不俗.在荣登多个排 ...
- IEEE专访李开复:人类已打开潘多拉盒子,封堵AI变革只会徒劳
原作 :<IEEE Spectrum> 量子位 转载 | 公众号 QbitAI 近期,李开复新书<AI·未来>在美国同样反响不俗. 在荣登多个排行榜后,IEEE旗下<I ...
- 微软获 OpenAI 独家 GPT-3 模型授权,是潘多拉还是聚宝盆?
作者 | 八宝粥 出品 | 程序人生(ID:coder_life) 9 月 20 日,微软宣布与 OpenAI 达成合作协议,得到了目前最火的 GPT-3 语言模型的独家授权,微软 CTO Kevin ...
- 谁打开了便携笔记本的潘多拉盒子
自从华硕推出Eee PC,HP.Acer.DELL都在近期推出自己的便携笔记本,有人将便携笔记本定位为超低价笔记本,其实便携笔记本与低价笔记本是两个概念,如果只论低价,国内神州笔记本电脑并不一定高过华 ...
- 初露锋芒的AI战斗机,打开AI军备竞赛的潘多拉盒子
作者|海怪 出品|脑极体 不久前,美国国防部高级研究计划局(DARPA)的ACE计划资助的一项名为"阿尔法狗斗"(AlphaDogfight Trials)的VR模拟人机对抗赛中, ...
最新文章
- TensorFlow(7)卷积神经网络实战(1)(可视化)
- C#组件系列——又一款日志组件:Elmah的学习和分享
- struts2.2.3需包含的jar包
- No module named 'MySQLdb'
- Oracle数据库——SQL高级查询
- 发布-订阅消息常用通信方式
- python异步asy_Python 异步编程之asyncio【转载】
- 前端组件化的三种方案:
- 随笔编号-04 AngularJS 相关小问题解决方案合集
- vue请求数据完成后执行_生产库删除数据后怎样执行对应的undo sql来恢复数据?...
- expect脚本同步文件,expect脚本指定host和要同步的文件,构建文件分发系统,批量远程执行命令...
- 「我们的首要之务,并不是遥望模糊的远方,而是专心处理眼前的事务。」---这是卡内基先生所强调的克服忧虑、开创人生的关键。...
- Leetcode 刷题笔记(三十) ——动态规划篇之子序列问题:回文
- Cisco基础(六):配置目前网络环境、项目阶段练习
- LayaAir 位图添加遮罩与滤镜
- 计算机重新启动后打印机脱机,重新启动计算机后打印机脱机怎么办
- 为什么要升级PLM系统
- 高仿富途牛牛-组件化(四)-优秀的时钟
- Yuuki and a problem (树套树)
- 基于STM32根据DL/T 645-2007通讯协议利用RS485进行抄表并将电压等数据利用HC-05蓝牙实时传输至上位机显示
热门文章
- 浅谈架构、操作系统、芯片的理解
- 企业网站[正能量系列]失业的程序员(一)
- 抖音低俗内容被处罚:账号重新评估,投稿不推荐该怎么办丨国仁网络
- 腾讯视频 电视剧/电影 分类统计大全
- 各串口设备节点/dev/tty* 的区别
- 大咖丨昆仑数据陈晨:工业大数据真正要做的是智能分析和智能决策
- Android 5.0 and later only support position-independent executables
- 短信网关 php,php使用ICQ网关发送手机短信_PHP
- [Python]简单抓取百度blog
- XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Siberia