关于这道题,其实看懂了的话还是比较好写的,只是题目实在又臭又长,没有让人读下去的勇气。

  给出题目翻译:

  给你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

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

 
  那么只要题看懂,恭喜你,这题你就A了一半了。
  由于极小的数据,所以判断亲爹的关系可以暴力搜索来解决(谁叫它数据小呢 doge脸)。
  然后我们可以把有父子关系的点连边,
  然后在图上找最长路就好了,但是由于这道题是允许有环的关系的,所以可以用tarjan缩个点。。。之后再暴搜一遍(doge脸*2)
  然后重点就没有啦。。。
  由于题目代码会较长,所以可以很好的考察代码能力。
愉快的贴出代码
 /**************************************************************
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+)的更多相关文章

  1. 洛谷 2921 记忆化搜索 tarjan 基环外向树

    洛谷 2921 记忆化搜索 tarjan 传送门 (https://www.luogu.org/problem/show?pid=2921) 做这题的经历有点玄学,,起因是某个random题的同学突然 ...

  2. 【python】Leetcode每日一题-二叉搜索迭代器

    [python]Leetcode每日一题-二叉搜索迭代器 [题目描述] 实现一个二叉搜索树迭代器类BSTIterator ,表示一个按中序遍历二叉搜索树(BST)的迭代器: BSTIterator(T ...

  3. 刷题向》图论》BZOJ1179 关于tarjan和SPFA的15秒(normal)

    这道题可以考察图论的掌握程度(算半道水题) 题目如下 输入 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i ...

  4. leetcode刷题-79单词搜索

    题目 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字母不允许被重复 ...

  5. 刷LeetCode的正确姿势——第1、125题

    最近刷LeetCode比较频繁,就购买了官方的参考电子书 (CleanCodeHandbook),里面有题目的解析和范例源代码,可以省去非常多寻找免费经验分享内容和整理这些资料的时间.惊喜的是,里面的 ...

  6. LCA离线Tarjan,树上倍增入门题

    离线Tarjian,来个JVxie大佬博客最近公共祖先LCA(Tarjan算法)的思考和算法实现,还有zhouzhendong大佬的LCA算法解析-Tarjan&倍增&RMQ(其实你们 ...

  7. POJ 1321 棋盘问题(DFS板子题,简单搜索练习)

    棋盘问题 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 44012   Accepted: 21375 Descriptio ...

  8. 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 ...

  9. 简单tarjan》一道裸题(BZOJ1051)(easy)

    这是一道水题,实际考察的是你会不会写强连通分量...(在BZOJ上又水了一道题) Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B ...

随机推荐

  1. Ubuntu命令:sudo、shutdown、apt-get、vim

    切换成ROOT用户: Ubuntu中默认不开启root账户,所以root账户是没有密码的, 但是会有一个非root的管理员账户,可以通过sudo来获得root权限,现在就可以用这个账户来设置密码 ** ...

  2. asp.net identity的学习记录

    # identity数据库 ## 创建空数据库 交给ef管理 ### 添加asp.net identity包 ``` Install-Package Microsoft.AspNet.Identity ...

  3. LOJ#2351. 「JOI 2018 Final」毒蛇越狱

    LOJ#2351. 「JOI 2018 Final」毒蛇越狱 https://loj.ac/problem/2351 分析: 首先有\(2^{|?|}\)的暴力非常好做. 观察到\(min(|1|,| ...

  4. return super(ParamValueInline,self).formfield_for_foreignkey(db_field,request,**kwargs)自己返回自己的父类

    作者:刘强胜链接:https://www.zhihu.com/question/30361435/answer/83940591来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...

  5. gradle wrapper 简单使用

    其实就是对于gradle 的一个包装,保证了项目版本的一致,同时减少配置   1. 生成wrapper // 使用gradle wrapper 命令 gradle wrapper 输出效果如下: [r ...

  6. mybatis排序

    排序的时候#和$的分别 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by ...

  7. oracle11g,安装失败,提示找不到文件,win7 64位下报错

    提示: 未找到文件 E:\app\Administrator\product\11.2.0\dbhome_5\owb\external\oc4j_applications\applications\W ...

  8. (转)Apache转发配置

    本文转载自:http://blog.csdn.net/leshjmail/article/details/6163581 安装文件 1.httpd-2.2.15-win32-x86-no_ssl.ms ...

  9. Spring启动后获取所有拥有特定注解的Bean,注解的属性值

    最近项目中遇到一个业务场景,就是在Spring容器启动后获取所有的Bean中实现了一个特定接口的对象,第一个想到的是ApplicationContextAware,在setApplicationCon ...

  10. elasticsearch5.6.8中文分词器

    安装分词器,务必确保版本一致! 下载地址:https://github.com/medcl/elasticsearch-analysis-ik 为了保证一致,我特地将elasticsearch进行降级 ...