题目描述

题解:

题目的描述比较长,理解起来也有一定难度。仔细读题后我们发现整个任务可以分成两个部分:找出咒语机之间所有的升级关系、求最长升级序列。

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 潘多拉的盒子相关推荐

  1. bzoj1194 [HNOI2006]潘多拉的盒子

    http://www.elijahqi.win/archives/3189 Description 传说中,有个神奇的潘多拉宝盒.如果谁能打开,便可以拥有幸福.财富.爱情.可是直到真的打开,才发现与之 ...

  2. BZOJ 1194: [HNOI2006]潘多拉的盒子 [DP DFA]

    传送门 题意: s个DFA,选出尽量多的自动机a0, a1, a2, . . . , at,使得a1包含a0.a2包 含a1,以此类推.s ≤ 50. DFA的字符集为{0,1},有的节点是输出源,节 ...

  3. 【BZOJ-1194】潘多拉的盒子 拓扑排序 + DP

    1194: [HNOI2006]潘多拉的盒子 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 456  Solved: 215 [Submit][St ...

  4. 第16章 潘多拉的盒子

    在分班后的高二上半学期的期末,孙斌新忽然不想上学了,想去当兵.我们不明白是什么导致他会有这样的想法.是因为高中的压力吗,还是适应不了这炼狱般的生活呢?我们不知道,知道的只是孙斌新在期末考完回家的路上, ...

  5. 专访李开复:人类已打开潘多拉盒子,封堵AI变革只会徒劳

    来源:人工智能学家 本文约3623字,建议阅读6分钟. 我们对李开复进行了专访,谈到了众多当前AI领域最受关注的话题. 摘要:近期,李开复新书<AI·未来>在美国同样反响不俗.在荣登多个排 ...

  6. IEEE专访李开复:人类已打开潘多拉盒子,封堵AI变革只会徒劳

    原作 :<IEEE Spectrum>  量子位 转载 | 公众号 QbitAI 近期,李开复新书<AI·未来>在美国同样反响不俗. 在荣登多个排行榜后,IEEE旗下<I ...

  7. 微软获 OpenAI 独家 GPT-3 模型授权,是潘多拉还是聚宝盆?

    作者 | 八宝粥 出品 | 程序人生(ID:coder_life) 9 月 20 日,微软宣布与 OpenAI 达成合作协议,得到了目前最火的 GPT-3 语言模型的独家授权,微软 CTO Kevin ...

  8. 谁打开了便携笔记本的潘多拉盒子

    自从华硕推出Eee PC,HP.Acer.DELL都在近期推出自己的便携笔记本,有人将便携笔记本定位为超低价笔记本,其实便携笔记本与低价笔记本是两个概念,如果只论低价,国内神州笔记本电脑并不一定高过华 ...

  9. 初露锋芒的AI战斗机,打开AI军备竞赛的潘多拉盒子

    作者|海怪 出品|脑极体 不久前,美国国防部高级研究计划局(DARPA)的ACE计划资助的一项名为"阿尔法狗斗"(AlphaDogfight Trials)的VR模拟人机对抗赛中, ...

最新文章

  1. TensorFlow(7)卷积神经网络实战(1)(可视化)
  2. C#组件系列——又一款日志组件:Elmah的学习和分享
  3. struts2.2.3需包含的jar包
  4. No module named 'MySQLdb'
  5. Oracle数据库——SQL高级查询
  6. 发布-订阅消息常用通信方式
  7. python异步asy_Python 异步编程之asyncio【转载】
  8. 前端组件化的三种方案:
  9. 随笔编号-04 AngularJS 相关小问题解决方案合集
  10. vue请求数据完成后执行_生产库删除数据后怎样执行对应的undo sql来恢复数据?...
  11. expect脚本同步文件,expect脚本指定host和要同步的文件,构建文件分发系统,批量远程执行命令...
  12. 「我们的首要之务,并不是遥望模糊的远方,而是专心处理眼前的事务。」---这是卡内基先生所强调的克服忧虑、开创人生的关键。...
  13. Leetcode 刷题笔记(三十) ——动态规划篇之子序列问题:回文
  14. Cisco基础(六):配置目前网络环境、项目阶段练习
  15. LayaAir 位图添加遮罩与滤镜
  16. 计算机重新启动后打印机脱机,重新启动计算机后打印机脱机怎么办
  17. 为什么要升级PLM系统
  18. 高仿富途牛牛-组件化(四)-优秀的时钟
  19. Yuuki and a problem (树套树)
  20. 基于STM32根据DL/T 645-2007通讯协议利用RS485进行抄表并将电压等数据利用HC-05蓝牙实时传输至上位机显示

热门文章

  1. 浅谈架构、操作系统、芯片的理解
  2. 企业网站[正能量系列]失业的程序员(一)
  3. 抖音低俗内容被处罚:账号重新评估,投稿不推荐该怎么办丨国仁网络
  4. 腾讯视频 电视剧/电影 分类统计大全
  5. 各串口设备节点/dev/tty* 的区别
  6. 大咖丨昆仑数据陈晨:工业大数据真正要做的是智能分析和智能决策
  7. Android 5.0 and later only support position-independent executables
  8. 短信网关 php,php使用ICQ网关发送手机短信_PHP
  9. [Python]简单抓取百度blog
  10. XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Siberia