Description

Sulotion

首先要对每对咒语机建图,判断机器a是否能生成所有机器b生成的

如果跑一个相同的串,最后结束的点b可输出a不可输出,判断就为否

大概就用这种思路,f[x][y]表示a中跑到x b中跑到y是否可行,然后大概记忆化搜索,只有两种转移

//感觉跑自动机的题目经常要这么(跑到了哪一个结点)表示状态

建图之后可能会有环(a和b生成的一样),于是强连通分量缩点

变成了DAG,然后dp记忆化搜索出答案

Code

一开始边的数组也直接用maxn了,最近怎么总是犯低级错误

 #include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=,maxm=1e4+; int S;
struct box{
int n,m,p[maxn][],ok[maxn];
}a[maxn];
int head[maxn],e[maxm],nxt[maxm],tot;
int adde(int u,int v){
e[++tot]=v,nxt[tot]=head[u];
head[u]=tot;
}
int low[maxn],pre[maxn],clock;
int scc[maxn],size[maxn],cnt,r[maxn],t; int c,d;
int vis[maxn][maxn];
int pd(int x,int y){
if(vis[x][y]) return ;
if(!a[c].ok[x]&&a[d].ok[y]) return ;
vis[x][y]=;
if(!pd(a[c].p[x][],a[d].p[y][])) return ;
if(!pd(a[c].p[x][],a[d].p[y][])) return ;
return ;
} int tarjan(int u){
pre[u]=low[u]=++clock;
r[++t]=u;
for(int i=head[u];i;i=nxt[i]){
int v=e[i];
if(!pre[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(!scc[v]){
low[u]=min(low[u],pre[v]);
}
}
if(pre[u]==low[u]){
++cnt;
while(t){
scc[r[t]]=cnt;
size[cnt]++;
if(r[t--]==u) break;
}
}
} int f[maxn],G[maxn][maxn];
int dfs(int u){
if(f[u]) return f[u];
int ret=;
for(int v=;v<=cnt;v++)
if(G[u][v]) ret=max(ret,dfs(v));
return f[u]=ret+size[u];
} int main(){
int x;
scanf("%d",&S);
for(int k=;k<=S;k++){
scanf("%d%d",&a[k].n,&a[k].m);
for(int i=;i<=a[k].m;i++)
scanf("%d",&x),a[k].ok[x+]=;
for(int i=;i<=a[k].n;i++){
scanf("%d%d",&a[k].p[i][],&a[k].p[i][]);
a[k].p[i][]++,a[k].p[i][]++;
}
} for(int i=;i<=S;i++)
for(int j=;j<=S;j++)
if(i!=j){
memset(vis,,sizeof(vis));
c=i,d=j;
if(pd(,)) adde(c,d);
} for(int i=;i<=S;i++)
if(!pre[i]) tarjan(i); for(int i=;i<=S;i++)
for(int j=head[i];j;j=nxt[j])
if(scc[i]!=scc[e[j]]) G[scc[i]][scc[e[j]]]=; int ans=;
for(int i=;i<=cnt;i++)
ans=max(ans,dfs(i)); printf("%d\n",ans);
return ;
}

【强连通分量】Bzoj1194 HNOI2006 潘多拉的盒子的更多相关文章

  1. [BZOJ1194][HNOI2006][强连通分量Tarjan+dfs]潘多拉的盒子

    [BZOJ1194][HNOI2006]潘多拉的盒子 Input 第一行是一个正整数S,表示宝盒上咒语机的个数,(1≤S≤50).文件以下分为S块,每一块描述一个咒语机,按照咒语机0,咒语机1„„咒语 ...

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

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

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

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

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

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

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

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

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

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

  7. 1194: [HNOI2006]潘多拉的盒子 - BZOJ

    Description  Input 第一行是一个正整数S,表示宝盒上咒语机的个数,(1≤S≤50).文件以下分为S块,每一块描述一个咒语机,按照咒语机0,咒语机1„„咒语机S-1的顺序描述.每一块的 ...

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

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

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

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

随机推荐

  1. java并发编程——通过ReentrantLock,Condition实现银行存取款

         java.util.concurrent.locks包为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器.该框架允许更灵活地使用锁和条件,但以更难用的语法为代价. Lock 接口 ...

  2. c语言,文件操作总结

    C语言文件操作 一.标准文件的读写 1.文件的打开 fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程序就可用此FILE指针来 ...

  3. 修改input获取焦点背景黄色

    input:-webkit-autofill { -webkit-box-shadow: 0 0 0px 1000px white inset !important; }

  4. Python 函数和相关用法笔记

    python中%r和%s的区别 总结:%r打印时能够重现它所代表的对象 __str__和__repr__的用法

  5. HTTP协议、Ajax请求

    今天这篇文章呢,主要讲的就是关于HTTP协议.Ajax请求以及一些相关的小知识点.虽然内容不算多,可是是很重点的东西~ HTTP协议 1. http:超文本传输协议.简单.快速.灵活.无状态.无连接. ...

  6. 团队项目第二阶段个人进展——Day5

    一.昨天工作总结 冲刺第五天,找到了一个专门的提供后端数据服务的网站:leancloud,并学习了相关操作 二.遇到的问题 对leancloud的数据如何请求和响应不懂 三.今日工作规划 深入学习le ...

  7. java定时任务调度-Timer(1)

    一.定义 有且仅有一个后台线程对多个业务线程进行定时定频率的调度 二. Timer  ---->  Timer Task  (中有run();方法) 通过 new Timer().schedul ...

  8. dubbo实现原理简单介绍

    一.什么是dubbo   Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合).从服务模型的角度来看,     ...

  9. Java多线程-概念与原理

    一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程.比如在 ...

  10. Java 标准 I/O 介绍

    一.Java标准I/O知识体系图: 二.I/O是什么 I/O 是Input/Output(输入.输出)的简称,输入流可以理解为向内存输入,输出流是从内存输出. 三.Java I/O 用途与对应的流一览 ...