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 各类板子集合的更多相关文章

  1. C#中遍历各类数据集合的方法总结

    C#中遍历各类数据集合的方法总结: 1.枚举类型 //遍历枚举类型Sample的各个枚举名称 foreach (string sp in Enum.GetNames(typeof(Sample))) ...

  2. 【.NET】C#中遍历各类数据集合的方法

    [.NET]C#中遍历各类数据集合的方法   C#中遍历各类数据集合的方法,这里自己做下总结: 1.枚举类型             //遍历枚举类型Sample的各个枚举名称             ...

  3. c++算法竞赛常用板子集合(持续更新)

    前言 本文主要包含算法竞赛一些常用的板子,码风可能不是太好,还请见谅. 后续会继续补充没有的板子.当然我太菜了有些可能写不出来T^T 稍微有些分类但不多,原谅我QwQ 建议 Ctrl + F 以快速查 ...

  4. Tarjan算法——强连通、双连通、割点、桥

    Tarjan算法 概念区分 有向图 强连通:在有向图\(G\)中,如果两个顶点\(u, v\ (u \neq v)\)间有一条从\(u\)到\(v\)的有向路径,同时还有一条从\(v\)到\(u\)的 ...

  5. codeforce 427 C. Checkposts(tarjan 强连通分量)

    题目链接:http://codeforces.com/contest/427/problem/C 题目大意是有n个junctions,这些junctions之间有m条道路,两两相连,现在在juncti ...

  6. BZOJ 1969 树链剖分+Tarjan缩点

    发现自己Tarjan的板子有错误.发现可以用Map直接删去边,Get. 听说std是双连通.LCA.并查集.离线思想.用BIT维护dfs序和并查集维护LCA的动态缩点的好题 #include < ...

  7. 【bzoj2427】[HAOI2010]软件安装 Tarjan+树形背包dp

    题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大).但是现 ...

  8. PY 个板子计划【雾

    各类板子计划 A+B √ 放个鬼的链接[雾 欧拉筛 √ https://www.cnblogs.com/Judge/p/11690114.html 树状数组 √ 惨痛的教训,以后咱打数据结构的时候绝对 ...

  9. P5676 [GZOI2017]小z玩游戏【Tarjan】

    小z玩游戏 Tarjan算是板子题吧,但是要稍微做一些修改,建边需要多考虑,建立"虚点". 题目描述 小 z 很无聊. 小 z 要玩游戏. 小 z 有\(N\)个新游戏,第\(i\ ...

  10. 2014-9-9 NOIP模拟赛

    东方幻想乡系列模拟赛Stage 1命题 Nettle审题 Barty ccy1991911 FlanS39 Wagner T2 高精除高精,从来没写过,不知道怎么写,我就用大数减小数ans次,果断超时 ...

随机推荐

  1. NVIDIA的OpenUSD是什么? —— Universal Scene Description (USD)

    正如NVIDIA的老黄在2024年的技术大会上的展示一样,NVIDIA公司或许最准确的定义应该是计算机图形学公司,因为不论是NVIDIA搞GPU还是搞通用计算还是搞软件生态以至于现在搞AI搞机器人搞自 ...

  2. If Messi doesn't understand how to respect others, then he also doesn't deserve to receive respect from others.

    If Messi doesn't understand how to respect others, if he doesn't understand the spirit of honoring c ...

  3. 【转载】 NetworkManager——nmcli命令连接WIFI和创建热点

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/u014695839/article/de ...

  4. centos7.3离线安装和配置NFS

    概述 # NFS为 Network FileSystem 的简称,它的目的就是想让不同的机器.不同的操作系统可以彼此分享个别的档案啦! 目前在 Unix Like 当中用来做为文件服务器是相当不错的一 ...

  5. 后缀数组--SA--字符串

    SA (Suffix Array) -- 后缀数组 简介 这里明白两个定义: \(SA_i\) : 按字典序排列后大小为 \(i\) 的后缀的后缀头的下标. \(Rank_i\) : 后缀头的下标为 ...

  6. gcc 和 g++ 的区别

    gcc 和 g++ 是 GNU 编译器集合(GNU Compiler Collection,简称 GCC)中的两个不同命令,用于编译 C 和 C++ 代码.尽管它们都属于同一个编译器集合,但在处理 C ...

  7. Dify大语言模型应用开发平台新手必备:安装注册与私有服务器部署全步骤

    Dify简介 Dify是一个开源的大语言模型(Large Language Model, LLM)应用开发平台.它融合了后端即服务(Backend as a Service, BaaS)和LLMOps ...

  8. 【YashanDB知识库】YashanDB的JDBC/OCI驱动如何设置字符编码

    问题现象 Oracle.Mysql数据库链接串,JDBC驱动连接串可以指定客户端的编码格式: jdbc:mysql://hostname:port/database_name?useUnicode=t ...

  9. vim命令之多行注释

    vim常用命令之多行注释和多行删除 vim中多行注释和多行删除命令,这些命令也是经常用到的一些小技巧,可以大大提高工作效率. 1.多行注释: 1. 首先按esc进入命令行模式下,按下Ctrl + v, ...

  10. 手写一个Promise.all

    Promise.all 特性: 1. 按顺序返回结果数组; 2. 当所有promise完成才返回; 3. 返回第一个报错的promise的信息; 直接上代码: Promise._all = funct ...