tarjan 各类板子集合
tarjan大板子(非讲解):
1、普通缩点DGA
void tarjan(int x){
dfn[x]=low[x]=++cntp;
q.push(x);v[x]=1;
for(int i=head[x];i;i=bi[i].next){
int j=bi[i].to;
if(!dfn[j]){
tarjan(j);
low[x]=min(low[x],low[j]);
}
else if(v[j])low[x]=min(low[x],dfn[j]);
}
if(low[x]==dfn[x]){
int p;
num++;//缩点的个数
do{
p=q.top();
q.pop();
zh[p]=num;//zh[i]表示 i对应的缩点之后的点
cntt[num]++;//cntt[i]表示缩点之后i点代表的点的个数
v[p]=0;
}while(x!=p);
}
}
//重建边 很多题需要缩点重建边成一个DGA以后在进行操作
for(int i=1;i<=cnt;i++){
if(zh[bi[i].fr]!=zh[bi[i].to])ad(zh[bi[i].fr],zh[bi[i].to]);
}
2、求割点
void tarjan(int x,int root){
dfn[x]=low[x]=++cntp;
int fl=0;
for(int i=head[x];i;i=bi[i].next){
int j=bi[i].to;
if(!dfn[j]){
tarjan(j);
low[x]=min(low[x],low[j]);
if(low[j]>=dfn[x]){
fl++;
if(x!=root||fl>1)ge[x]=1;
}
}
else low[x]=min(low[x],dfn[j]);
}
}
3、求割边
void tarjan(int x,int id){
dfn[x]=low[x]=++cntp;
for(int i=head[x];i!=-1;i=bi[i].next){
int j=bi[i].to;
if(!dfn[j]){
tarjan(j,i);
low[x]=min(low[x],low[j]);
if(low[j]>dfn[x])bb[i]=bb[i^1]=1;//注意边要从0或2开始存
}
else if(i!=(id^1))low[x]=min(low[x],dfn[j]);
}
}
4、求边双连通分量
void tarjan(int x,int id){
dfn[x]=low[x]=++cntp;
q.push(x);
for(int i=head[x];i!=-1;i=bi[i].next){
// cout<<i<<' '<<id<<endl;
if(i==(id^1))continue;
int j=bi[i].to;
if(!dfn[j]){
tarjan(j,i);
low[x]=min(low[x],low[j]);
}
else low[x]=min(low[x],dfn[j]);
}
if(dfn[x]==low[x]){和父亲的边是割边,和栈里在他上面的点在一个边双连通分量里面。
num++;
int p;
do{
p=q.top();
q.pop();
zh[p]=num;
}while(p!=x);
}
}
5、点双连通分量
void tarjan(int x){
dfn[x]=low[x]=++cntp;
int fl=0;
for(int i=head[x];i;i=bi[i].next){
int j=bi[i].to;
if(!dfn[j]){
q.push(j);
tarjan(j);
low[x]=min(low[x],low[j]);
if(low[j]>=dfn[x]){
num++;
int p;
do{
p=q.top();
q.pop();
mann[num].ps(p);
}while(p!=j);
mann[num].ps(x);
}
}
else low[x]=min(low[x],dfn[j]);
}
}
END
tarjan 各类板子集合的更多相关文章
- C#中遍历各类数据集合的方法总结
C#中遍历各类数据集合的方法总结: 1.枚举类型 //遍历枚举类型Sample的各个枚举名称 foreach (string sp in Enum.GetNames(typeof(Sample))) ...
- 【.NET】C#中遍历各类数据集合的方法
[.NET]C#中遍历各类数据集合的方法 C#中遍历各类数据集合的方法,这里自己做下总结: 1.枚举类型 //遍历枚举类型Sample的各个枚举名称 ...
- c++算法竞赛常用板子集合(持续更新)
前言 本文主要包含算法竞赛一些常用的板子,码风可能不是太好,还请见谅. 后续会继续补充没有的板子.当然我太菜了有些可能写不出来T^T 稍微有些分类但不多,原谅我QwQ 建议 Ctrl + F 以快速查 ...
- Tarjan算法——强连通、双连通、割点、桥
Tarjan算法 概念区分 有向图 强连通:在有向图\(G\)中,如果两个顶点\(u, v\ (u \neq v)\)间有一条从\(u\)到\(v\)的有向路径,同时还有一条从\(v\)到\(u\)的 ...
- codeforce 427 C. Checkposts(tarjan 强连通分量)
题目链接:http://codeforces.com/contest/427/problem/C 题目大意是有n个junctions,这些junctions之间有m条道路,两两相连,现在在juncti ...
- BZOJ 1969 树链剖分+Tarjan缩点
发现自己Tarjan的板子有错误.发现可以用Map直接删去边,Get. 听说std是双连通.LCA.并查集.离线思想.用BIT维护dfs序和并查集维护LCA的动态缩点的好题 #include < ...
- 【bzoj2427】[HAOI2010]软件安装 Tarjan+树形背包dp
题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大).但是现 ...
- PY 个板子计划【雾
各类板子计划 A+B √ 放个鬼的链接[雾 欧拉筛 √ https://www.cnblogs.com/Judge/p/11690114.html 树状数组 √ 惨痛的教训,以后咱打数据结构的时候绝对 ...
- P5676 [GZOI2017]小z玩游戏【Tarjan】
小z玩游戏 Tarjan算是板子题吧,但是要稍微做一些修改,建边需要多考虑,建立"虚点". 题目描述 小 z 很无聊. 小 z 要玩游戏. 小 z 有\(N\)个新游戏,第\(i\ ...
- 2014-9-9 NOIP模拟赛
东方幻想乡系列模拟赛Stage 1命题 Nettle审题 Barty ccy1991911 FlanS39 Wagner T2 高精除高精,从来没写过,不知道怎么写,我就用大数减小数ans次,果断超时 ...
随机推荐
- 【转载】 推荐算法之Thompson(汤普森)采样
原文地址: https://www.cnblogs.com/gczr/p/11220187.html ------------------------------------------------- ...
- 为python安装扩展模块时报错——error: invalid command 'bdist_wheel'
具体过程: devil@hp:~/lab$ ./bazel-bin/python/pip_package/build_pip_package /tmp/dmlab_pkg2022年 10月 03日 星 ...
- Fedora安装后需要做的事情
http://blog.csdn.net/fengxinlinux/article/details/72794967
- 通过JUnit源码分析学习编程的奇技淫巧
打开 Maven仓库,左边选项栏排在第一的就是测试框架与工具,今天的文章,V 哥要来聊一聊程序员必备的测试框架JUnit 的源码实现,整理的学习笔记,分享给大家. 有人说,不就一个测试框架嘛,有必要去 ...
- 后端开发学习敏捷需求-->干系人分析与识别
干系人分析与识别 5W1H 干系人分析与识别 1. 干系人是什么 直接或者间接影响专题,以及被专题影响的人和组织,用户也是属于干系人,是产品直接或者间接的使用者 又叫利益相关者,指积极参与专题或者在专 ...
- 2024 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(国赛)
2024 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(国赛) 前言 补题只补了前四道,第五题打个暴力都有 \(24\) 分,我这死活只有 \(22\) 分 \(QAQ\) RC-u1 大家一起查 ...
- Unity FpsSample Demo研究
1.前言 Unity FpsSample Demo大约是2018发布,用于官方演示MLAPI(NetCode前身)+DOTS的一个FPS多人对战Demo. Demo下载地址(需要安装Git LFS) ...
- CORDIC算法解释及FPGA实现(圆坐标系)
CORDIC算法解释及Verilog仿真(圆坐标系) CORDIC算法原理阐述 CORDIC(Coordinate Rotation Digital Computer)算法,即坐标旋转数字计算方法,是 ...
- 一篇文章讲清楚Java中的反射
介绍 每个类都有一个 Class 对象,包含了与类有关的信息.当编译一个新类时,会产生一个同名的 .class 文件,该文件内容保存着 Class 对象. 类加载相当于 Class 对象的加载.类在第 ...
- 淘宝订单信息获取接口,淘宝订单信息获取API
在日常电商软件开发的工作中,我们经常会遇到需要淘宝的订单信息的场景,比如:打单.发货,又比如做BI工具等.这就需要用到淘宝订单信息获取接口.只有获取到淘宝订单信息,才能进行下一步工作. 目前这个接口是 ...