Description

 
Input

第一行是一个正整数S,表示宝盒上咒语机的个数,(1≤S≤50)。文件以下分为S块,每一块描述一个咒语机,按照咒语机0,咒语机1„„咒语机S-1的顺序描述。每一块的格式如下。 一块的第一行有两个正整数n,m。分别表示该咒语机中元件的个数、咒语源输出元的个数(1≤m≤n≤50)。 接下来一行有m个数,表示m个咒语源输出元的标号(都在0到n-1之间)。 接下来有n行,每一行两个数。第i行(0≤i≤n-1)的两个数表示pi,0和pi,1(当然,都在0到n-1之间)。
Output

第一行有一个正整数t,表示最长升级序列的长度。
Sample Input

4

1 1

0

0 0

2 1

0

1 1

0 0

3 1

0

1 1

2 2

0 0

4 1

0

1 1

2 2

3 3

0 0

Sample Output

3

终于AC了

网上说的那个二元组的确很神奇,用bfs判断出两个咒语机的关系,初始状态为(0,0),状态(x,y)表示在A咒语机上x格停留,在B咒语机上y格停留

当有一个状态(x,y)x是输出元,而y不是的话,则B咒语机有一个咒语不能产生而A能产生

现在我们求出了一个有向图,要求最长链,首先就是要消去环,我们发现咒语机不可能出现A-->B-->C-->A但是A不是C的升级,相当于A>=B>=C>=A那么A,B,C相等

所以我们对点进行染色,对于一个没有染色的点,我们把和它等价的点涂成一样的颜色(也就是一个强连通分量),只要i到j有边,j到i有边,i和j就是一个强连通分量里的,否则就不是

染完色之后缩点,就是一个森林了,于是dp出最大权值链(这时点上有权,就是涂成这个颜色的点的个数)

主要是因为如果打tarjan太长了,根本不想打,而且只有50个点,明显就是给我们乱搞的嘛

 var
p:array[..,..,..]of longint;
flag,l:array[..,..]of boolean;
n:longint; function max(x,y:longint):longint;
begin
if x>y then exit(x);
exit(y);
end; procedure init;
var
i,j,a,b,k:longint;
begin
read(n);
for i:= to n do
begin
read(a,b);
for j:= to b do
begin
read(k);
flag[i,k]:=true;
end;
for j:= to a- do
read(p[i,j,],p[i,j,]);
end;
end; var
d:array[..,..]of longint;
v:array[..,..]of boolean; procedure work;
var
i,j,k,head,tail:longint;
flagi,flagj:boolean;
begin
for i:= to n- do
for j:=i+ to n do
begin
head:=;
tail:=;
d[,]:=;
d[,]:=;
fillchar(v,sizeof(v),true);
v[,]:=false;
flagi:=true;
flagj:=true;
while head<=tail do
begin
if flag[i,d[head,]]<>flag[j,d[head,]] then
begin
if flag[i,d[head,]] then flagj:=false;
if flag[j,d[head,]] then flagi:=false;
end;
if (flagi=false)and(flagj=false) then break;
for k:= to do
if v[p[i,d[head,],k],p[j,d[head,],k]] then
begin
v[p[i,d[head,],k],p[j,d[head,],k]]:=false;
inc(tail);
d[tail,]:=p[i,d[head,],k];
d[tail,]:=p[j,d[head,],k];
end;
inc(head);
end;
if flagi then l[i,j]:=true;
if flagj then l[j,i]:=true;
end;
end; var
map:array[..,..]of boolean;
c,f,du,s:array[..]of longint;
vis:array[..]of boolean;
col,num,ans:longint; procedure get;
var
i,j:longint;
begin
for i:= to n do
if c[i]= then
begin
inc(col);
c[i]:=col;
inc(s[col]);
for j:= to n do
if l[i,j] and l[j,i] then
begin
c[j]:=col;
inc(s[col]);
end;
end;
for i:= to n do
for j:= to n do
if c[i]<>c[j] then
if l[i,j] then map[c[i],c[j]]:=true;
for i:= to col do
for j:= to col do
if map[i,j] then inc(du[j]);
fillchar(vis,sizeof(vis),true);
num:=col;
while num> do
begin
for i:= to col do
if (vis[i])and(du[i]=) then
begin
vis[i]:=false;
dec(num);
for j:= to col do
if map[i,j] then
begin
dec(du[j]);
f[j]:=max(f[j],f[i]+s[i]);
end;
end;
end;
for i:= to col do
ans:=max(ans,f[i]+s[i]);
write(ans);
end; begin
init;
work;
get;
end.

1194: [HNOI2006]潘多拉的盒子 - BZOJ的更多相关文章

  1. 图论(Tarjan缩点):BZOJ 1194: [HNOI2006]潘多拉的盒子

    1194: [HNOI2006]潘多拉的盒子 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 344  Solved: 181[Submit][Stat ...

  2. BZOJ 1194: [HNOI2006]潘多拉的盒子( BFS + tarjan + dp )

    O(S²)枚举2个诅咒机, 然后O(n²)BFS去判断. 构成一个有向图, tarjan缩点, 然后就是求DAG的最长路.. ------------------------------------- ...

  3. 1194: [HNOI2006]潘多拉的盒子

    1194: [HNOI2006]潘多拉的盒子 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 464  Solved: 221[Submit][Stat ...

  4. BZOJ 1194 [HNOI2006]潘多拉的盒子 (图论+拓扑排序+tarjan)

    题面:洛谷传送门 BZOJ传送门 标签里三个算法全都是提高组的,然而..这是一道神题 我们把这道题分为两个部分解决 1.找出所有咒语机两两之间的包含关系 2.求出咒语机的最长上升序列 我们假设咒语机$ ...

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

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

  6. BZOJ1194: [HNOI2006]潘多拉的盒子(tarjan)

    Description 传说中,有个神奇的潘多拉宝盒.如果谁能打开,便可以拥有幸福.财富.爱情.可是直到真的打开,才发现与之 相随的还有灾难.不幸.其实,在潘多拉制造这个宝盒的时候,设置了一些咒语来封 ...

  7. 【bzoj1194】 HNOI2006—潘多拉的盒子

    http://www.lydsy.com/JudgeOnline/problem.php?id=1194 (题目链接) 题意 给出S个自动机,如果一个自动机u的所有状态是另一个自动机v的状态的子集,那 ...

  8. 【强连通分量】Bzoj1194 HNOI2006 潘多拉的盒子

    Description Sulotion 首先要对每对咒语机建图,判断机器a是否能生成所有机器b生成的 如果跑一个相同的串,最后结束的点b可输出a不可输出,判断就为否 大概就用这种思路,f[x][y] ...

  9. HNOI2006 潘多拉的盒子

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

随机推荐

  1. Angular 全局页面切换动画 me-pageloading

    最近看了Codrops的一篇文章, 里面讲到了一个页面切换的效果, 详情点击此处. 看了这个效果感觉很赞, 觉得这个效果可以用在angular的页面切换中, 所以将这个效果移植到angular中, 做 ...

  2. Javascript中的冒泡排序,插入排序,选择排序,快速排序,归并排序,堆排序 算法性能分析

    阿里面试中有一道题是这样的: 请用JavaScript语言实现 sort 排序函数,要求:sort([5, 100, 6, 3, -12]) // 返回 [-12, 3, 5, 6, 100],如果你 ...

  3. 解决ASP.NET网站发布问题

    目录 前言 开始 aspx.cs文件放到单独的类库项目 一个可选择勾选页面的发布工具:LimusicAddin 前言 Asp.net 发布分为:动态编译和预编译.预编译又分为:In Place Pre ...

  4. sql常识-FULL JOIN

    SQL FULL JOIN 关键字 只要其中某个表存在匹配,FULL JOIN 关键字就会返回行. FULL JOIN 关键字语法 SELECT column_name(s) FROM table_n ...

  5. SQL_转换格式的函数—CAST()和CONVERT()

    将一种数据类型的表达式显式转换为另一种数据类型的表达式.CAST 和 CONVERT 提供相似的功能. cast SELECT CAST('12.5' AS int) --在将 varchar 值 ' ...

  6. 【转载】 c语言inline函数的使用

    c语言inline函数的使用 转载自:http://blog.chinaunix.net/uid-21843265-id-3056446.html 大学在教科书上学习过inline函数,定义为inli ...

  7. Cocos2d-x中__Dictionary容器以及实例介绍

    __Dictionary类在Cocos2d-x 2.x时代它就是CCDictionary类,它是模仿Objective-C中的NSDictionary类而设计的,通过引用计数管理内存.__Dictio ...

  8. int/double/string使用

    在计算机中存储数据和儿童在抽屉中存放物品很类似. 例如: 要在计算机中存一个数字50,需要两句话. int a;  //将要放的物品告诉家长 a=50;  //将物品放到某个抽屉中 计算机存储变量的过 ...

  9. Mysql 数据库的介绍

    MySQL 数据库: Oracle.DB2.SQL Server.MySQL.access.mangodb.bigtable 关系型数据库 大型 Oracle.DB2 中小型 SQL Server.M ...

  10. Js 变量的作用域

    变量的作用域 所有的变量作用域是指在哪里可用哪里不可用 局部作用域和全局作用域 在js中以函数来分割作用域 在函数里面就叫做局部作用域,在函数外面的就叫全局作用域 在函数里面如果省略var 关键字 那 ...