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

  给出题目翻译:

  给你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. Golang Printf、Sprintf 、Fprintf 格式化

    /* %v 输出结构体 {10 30} %+v 输出结构体显示字段名 {one:10 tow:30} %#v 输出结构体源代码片段 main.Point{one:10, tow:30} %T 输出值的 ...

  2. 演示使用Metasploit入侵Android

    文本演示怎么使用Kali Linux入侵Android手机. Kali Linux IP地址:192.168.0.112:接收连接的端口:443. 同一局域网内android手机一部(android ...

  3. HDU - 6433: H. Pow (简答题,输出大数)

    There are n numbers 3^0, 3^1, . . . , 3^n-1. Each time you can choose a subset of them (may be empty ...

  4. c#模拟键盘输入

    System.Windows.Forms.SendKeys.SendWait("j");

  5. verilog中task的用法

    任务就是一段封装在“task-endtask”之间的程序.任务是通过调用来执行的,而且只有在调用时才执行,如果定义了任务,但是在整个过程中都没有调用它,那么这个任务是不会执行的.调用某个任务时可能需要 ...

  6. 关于matlab浮点转定点总结

    1,算式长度不应该太长,否则在转换过程中提示位宽超过128位,(用的64位matlab),长算式改为短算式就可以了. 2,不要过于相信推荐字长,有些地方需要更高的精度,如果用推荐字长,可能结果误差较大 ...

  7. FastAdmin 出现慢的问题 (DB host)

    FastAdmin 出现慢的问题 用户反馈断网后 FastAdmin 后台变慢. 而且是很多同事出现一样的现象. 查看了 runtime / log 里的日志,发现 DB 时间超过 20s. 经过群里 ...

  8. onItemLongClick事件的监听

    首先需要implements public class MainActivity extends AppCompatActivity implements OnItemLongClickListene ...

  9. 【转】使用JMeter 完成常用的压力测试(一)

    本文介绍了 JMeter 相关的基本概念.并以 JMeter 为例,介绍了使用它来完成最常用的三种类型服务器,即 Web服务器.数据库服务器和消息中间件,压力测试的方法.步骤以及注意事项. 讲到测试, ...

  10. Java-Maven-Runoob:Maven 自动化构建

    ylbtech-Java-Maven-Runoob:Maven 自动化构建 1.返回顶部 1. 自动化构建定义了这样一种场景: 在一个项目成功构建完成后,其相关的依赖工程即开始构建,这样可以保证其依赖 ...