刷题向》关于搜索+tarjan的奇怪组合题 BZOJ1194 (normal+)
关于这道题,其实看懂了的话还是比较好写的,只是题目实在又臭又长,没有让人读下去的勇气。
给出题目翻译:
给你S张图,
每张图有M个点,其中M个点中有N个是特殊单位,会给出。
每个点又有0、1两条边指向其他点。
这样我们每次从0这个点开始,选择向0或者向1走,是不是可以把路径表示成01串的形式捏?
每次我们在模拟路径时,遇到特殊单位就会输出这串01串。
那么图的包含关系定义为:A图输出的所有01串都可以在B中输出(即使是一样的图),这时就称B是A的亲爹;
那么你的任务是找出图中最长的家族关系。
当然不反对大家去看原题,祝大家平安
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
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
/**************************************************************
Problem: 1194
User: PencilWang
Language: C++
Result: Accepted
Time:4692 ms
Memory:2964 kb
****************************************************************/ #include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int S,s,n,m,a,b;
bool Ff[],mp[][],f,F[][];
int stack[],T,low[],w[],ass,fa[],time[],mmp[][][],head[],point;
int pa,pb,headd[];
struct shit{
int aim,next,fro;
}e[][];
int cn;
void tarjan(int x)
{
time[x]=low[x]=++T;
Ff[stack[++ass]=x]=true;
for(int i=head[x];i;i=e[][i].next)
{
if(!time[e[][i].aim])
{
tarjan(e[][i].aim);
low[x]=min(low[x],low[e[][i].aim]);
}
else if(Ff[e[][i].aim])low[x]=min(low[x],time[e[][i].aim]);
}
if(time[x]==low[x])
{
Ff[x]=false;
w[fa[x]=++cn]=;
while(stack[ass]!=x)
{
w[fa[stack[ass]]=cn]++;
Ff[stack[ass--]]=false;
}
--ass;
}
}
void dfs(int x,int y)
{
if(F[x][y]||f)return ;
F[x][y]=true;
if(!mp[pa][x]&&mp[pb][y]){f=true;return ;}
dfs(mmp[pa][x][],mmp[pb][y][]);
dfs(mmp[pa][x][],mmp[pb][y][]); }
bool check()
{
memset(F,false,sizeof(F));
f=false;
dfs(,);
return !f;
}
void fuck(int x,int y)
{
e[][++point]=(shit){y,head[x],x};head[x]=point;
}
int cnt;
void rebuild()
{
for(int i=;i<=S;i++)
{
for(int j=head[i];j;j=e[][j].next)
if(fa[i]!=fa[e[][j].aim])
{
e[][++cnt].aim=fa[e[][j].aim];
e[][cnt].next=headd[fa[i]];
e[][cnt].fro=fa[i];
headd[fa[i]]=cnt;
}
}
}
int ans[];
int fi(int x)
{
if(ans[x])return ans[x];
ans[x]=w[x];
for(int i=headd[x];i;i=e[][i].next)
ans[x]=max(ans[x],fi(e[][i].aim)+w[x]);
return ans[x];
}
int find_ans()
{
int sb_1=;
for(int i=;i<=cn;i++)sb_1=max(sb_1,fi(i));
return sb_1;
}
int main()
{
scanf("%d",&S);
for(s=;s<=S;s++)
{
fa[s]=s;
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
scanf("%d",&a);
mp[s][a+]=true;
}
for(int i=;i<=n;i++)
{
scanf("%d%d",&a,&b);
mmp[s][i][]=a+;mmp[s][i][]=b+;
}
}
for(int i=;i<=S;i++)
for(int j=;j<=S;j++)
{
if(j==i)continue;
pa=i;
pb=j;
if(check()){fuck(i,j);}
}
for(int i=;i<=S;i++)
if(!time[i])tarjan(i);
rebuild();
printf("%d",find_ans());
return ;
}
1194
刷题向》关于搜索+tarjan的奇怪组合题 BZOJ1194 (normal+)的更多相关文章
- 洛谷 2921 记忆化搜索 tarjan 基环外向树
洛谷 2921 记忆化搜索 tarjan 传送门 (https://www.luogu.org/problem/show?pid=2921) 做这题的经历有点玄学,,起因是某个random题的同学突然 ...
- 【python】Leetcode每日一题-二叉搜索迭代器
[python]Leetcode每日一题-二叉搜索迭代器 [题目描述] 实现一个二叉搜索树迭代器类BSTIterator ,表示一个按中序遍历二叉搜索树(BST)的迭代器: BSTIterator(T ...
- 刷题向》图论》BZOJ1179 关于tarjan和SPFA的15秒(normal)
这道题可以考察图论的掌握程度(算半道水题) 题目如下 输入 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i ...
- leetcode刷题-79单词搜索
题目 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字母不允许被重复 ...
- 刷LeetCode的正确姿势——第1、125题
最近刷LeetCode比较频繁,就购买了官方的参考电子书 (CleanCodeHandbook),里面有题目的解析和范例源代码,可以省去非常多寻找免费经验分享内容和整理这些资料的时间.惊喜的是,里面的 ...
- LCA离线Tarjan,树上倍增入门题
离线Tarjian,来个JVxie大佬博客最近公共祖先LCA(Tarjan算法)的思考和算法实现,还有zhouzhendong大佬的LCA算法解析-Tarjan&倍增&RMQ(其实你们 ...
- POJ 1321 棋盘问题(DFS板子题,简单搜索练习)
棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 44012 Accepted: 21375 Descriptio ...
- hdu 2586 How far away ?(LCA - Tarjan算法 离线 模板题)
How far away ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- 简单tarjan》一道裸题(BZOJ1051)(easy)
这是一道水题,实际考察的是你会不会写强连通分量...(在BZOJ上又水了一道题) Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B ...
随机推荐
- Java中BIO,NIO,AIO的理解
在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解.具体如下: 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞? 5 什么是同步阻塞? 6 什么是同步非阻塞? 7 ...
- Linux字符界面访问U盘
首先查看U盘所在位置 fdisk -l 只需查看最后分区情况,例如找到U盘的位置为:/dev/sda1(视系统而定) 创建文件夹(用于挂载U盘内容) mkdir /mnt/usb 挂载 mount / ...
- 剑指offer-第六章面试中的各项能力(二叉树的深度)
题目:1:输入一个二叉树,求二叉树的深度.从根节点开始最长的路径. 思路:我们可以考虑用递归,求最长的路径实际上就是求根节点的左右子树中较长的一个然后再加上1. 题目2:输入一颗二叉树的根节点,判断该 ...
- 【java规则引擎】java规则引擎搭建开发环境
Drools官网:http://www.jboss.org/drools Drools and jBPM consist out of several projects:(Drools软件包提供的几个 ...
- sublime text 3设置浏览器快捷键
一.设置默认浏览器 1,打开sublime 依次选择 tools > build system > new build system... 2,选择你喜欢的浏览器,右键 > 属性 把 ...
- stp 零部件 转为 装配图
stp 零部件 转为 装配图 起因 由于收到的 stp 为零件件,这时如果输出 eDrawings 文件时是没有装配结构的. 解决 打开 stp 后在资源管理器中有一个实体的文件夹,点右键保存实体. ...
- 百度浏览器极速模式下访问 FastAdmin 的问题
百度浏览器极速模式下访问 FastAdmin 的问题 兼容性问题,因为 https 证书配置时对低版本的浏览器不适配引起. 应该是 百度浏览器的内核太旧,没有更新导致.
- sklearn one_hot 操作
1.编码 one_hot编码不再过多叙述,类似于hash的那种方法去改变数的编码方式.比如label存在与(0,1,2,3),那么一条记录的label为3,那么将编码维[0,0,0,1] 2.包: t ...
- (转)在二元树中找出和为某一值的所有路径,java版本
摘自:http://www.cnblogs.com/qi09/archive/2011/05/24/2055643.html 4.在二元树中找出和为某一值的所有路径 题目:输入一个整数和一棵二元树. ...
- apache通过.htaccess(rewrite)判断手机电脑跳转-手机用户重定向到手机版
自动判断.重定向的办法也有几种: 使用网站构建的程序(例如PHP)来判断.重定向:使用服务器上的Web服务(例如Apache)来判断.重定向. 在Apache中设置重定向有两个办法: 在网站的http ...