刷题向》关于搜索+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 ...
随机推荐
- 前端之JavaScript再次补充(干死!!)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- (三十六)类数组对象arguments
类数组对象:arguments 在函数调用时,我们总能见到arguments这个对象,它具体是用来干什么的呢?感觉逼格非常高呢 函数在使用时,我们总会位函数传入各种参数,arguments会将参数储存 ...
- 重温CLR(六)方法和参数
实例构造器和类(引用类型) 构造器是将类型的实例初始化为良好状态的特殊方法.构造器方法在“方法定义元数据表”中始终叫做.ctor(constructor的简称).创建引用类型的实例时,首先为实例的数据 ...
- 《.NET程序员面试秘籍》读书笔记
1. 简述 private. protected. public. internal 修饰符的访问权限. private :设置类或类的成员为私有,在类的内部才可以访问.有时要访问私有成员时,可通过g ...
- HttpWebRequest传值
From:发送方 class Program { static void Main(string[] args) { string strId = "zhangsan"; &quo ...
- 关于 FastAdmin 中的 trait
关于 FastAdmin 中的 trait 来自ThinkPHP5 官网的介绍 1 trait是一种为类似 PHP 的单继承语言而准备的代码复用机制.trait为了减少单继承语言的限制,使开发人员能够 ...
- 73个word使用终极技巧
1.问:Word里边怎样设置每页不同的页眉?如何使不同的章节显示的页眉不同? 答:分节,每节可以设置不同的页眉.文件——页面设置——版式——页眉和页脚——首页不同 2.问:请问Word中怎样让每一章用 ...
- HTTP/HTTPS原理详解
简介 HTTP(Hypertext Transfer Protocal,超文本传输协议)是WWW(World Wide Web,万维网)数据传输的基础,规定如何传输超文本.HTTP协议存在多个版本:H ...
- java图形化界面-------鼠标监听画圆----------使用匿名类
package com.aa; import java.awt.Color; import java.awt.Graphics; import java.awt.event.MouseAdapter; ...
- XAMPP配置8080端口
IIS需要HTTP服务,这个服务占用了80端口. Apache启动不了,为了都可以使用,将Apache端口改为8080.