子图:由这张图的一部分构成的图

点:节点
边:连接节点的东西,分为有向和无向
重边:两点之间存在两条及以上的边

自环:自己连自己的边
环:一些边使得这些点可以不重复经过这些边到达上面的任意一个节点
简单环:除去自环的环

rtrtrt:该搜索树的根
dfn[x]dfn[x]dfn[x]:xxx的搜索序
low[x]low[x]low[x]:xxx的子树中能够追溯到最小的dfndfndfn

stk[x]stk[x]stk[x]:基于搜索序的栈
toptoptop:上述栈的栈顶

无向图: 边没有方向的图

无向图连通分量:由一些点和连接它们的边构成的子图,这些点间通过这些边相互到达

割点:去除这个点以及这个点相连的边后使得联通快数量增加的点
判定法则:一个非rtrtrt的点xxx是割点,当且仅当dfnx≤lowydfn_x\leq low_ydfnx​≤lowy​。特别地,当x=rtx=rtx=rt时,需要至少两个yyy

割边:去除这条边后使得联通快数量增加的边
判定法则:一条边(x,y)(x,y)(x,y)是割边,当且仅当dfnx<lowydfn_x<low_ydfnx​<lowy​

点双:没有割点的连通分量
判定法则:节点数最多为2,任意两点同时包含在至少一个简单环中

dcc[x]dcc[x]dcc[x]:编号为xxx的点双的集合

边双:没有割边的连通分量
判定法则:任意边都被包含在至少一个简单环中

which[x]which[x]which[x]:xxx属于哪个边双

边双缩点:以边双序号为新的节点序号,建一个新的无向图

CodeCodeCode
主程序部分必备

for(register int i=1;i<=n;i++) if(!dfn[i]) Tarjan(i);

割点&割边

inline void Tarjan(int x)
{dfn[x]=low[x]=++cnt;int flg=0;for(register int i=l[x];i;i=e[i].next){int y=e[i].to;if(dfn[y]==0){Tarjan(y);low[x]=min(low[x],low[y]);if(dfn[x]<=low[y]){flg++;if(flg>1||x!=rt) mark[x]=true;//割点判定}if(low[y]>dfn[x]) bridge[i]=bridge[i^1]=true;//割边判定}else low[x]=min(low[x],dfn[y]);}return;
}

求每个点属于哪个边双(不走割边遍历整张图)

int which[N],gs;
inline void dfs(int x)
{which[x]=gs;for(register int i=l[x];i;i=e[i].next){int y=e[i].to;if(which[y]||bridge[i]) continue;dfs(y);}return;
}
signed main()
{……for(register int i=1;i<=n;i++) if(!which[i]) gs++,dfs(i);
}

求点双

inline void Tarjan(int x)
{dfn[x]=low[x]=++cnt;int flg=0;stk[++top]=x;if(x==root&&l[x]==0) return (void)(dcc[++gs].push_back(x));for(register int i=l[x];i;i=e[i].next){int y=e[i].to;if(dfn[y]==0){Tarjan(y);low[x]=min(low[x],low[y]);if(dfn[x]<=low[y]){flg++;if(flg>1||x!=rt) mark[x]=true;//割点判定gs++;int z;do{z=stk[top--]dcc[gs].push_back(z);}while(z!=y);dcc[gs].push_back(x);}if(low[y]>dfn[x]) bridge[i]=bridge[i^1]=true;//割边判定}else low[x]=min(low[x],dfn[y]);}return;
}

有向图:边有方向的图

有向图连通分量:由一些点和连接它们的边构成的子图
有向图强连通分量:由一些点和连接它们的边构成的子图,这些点间通过这些边相互到达
判定法则:low[x]=dfn[x]low[x]=dfn[x]low[x]=dfn[x]

which[x]which[x]which[x]:xxx属于哪个强联通分量

缩点

inline void Tarjan(int x)
{low[x]=dfn[x]=++cnt;stk[++top]=x;vis[x]=true;for(register int i=l[x];i;i=e[i].next){int y=e[i].to;if(dfn[y]==0){Tarjan(y);low[x]=min(low[x],low[y]);}else if(vis[y]) low[x]=min(low[x],dfn[y]);}if(dfn[x]==low[x]){int y;while(y=stk[top--]){which[y]=x;vis[y]=false;if(x==y) break;val[x]+=val[y];}return;}
}
signed main()
{……for(register int i=1;i<=n;i++) if(!dfn[i]) Tarjan(i);for(register int i=1;i<=n;i++)for(register int k=l[i];k;k=e[k].next){int j=e[k].to;if(which[i]!=which[j]) ADD(which[i],which[j]),rd[which[j]]++; }
}

参考文献

lyd《算法竞赛进阶指南》

Tarjan学习小记相关推荐

  1. 8086汇编学习小记-王爽汇编语言实验12

    8086汇编学习小记-王爽汇编语言实验12 0号中断处理程序,开始安装在0000:0200处的程序最后用死循环导致显示不出'divided error',改成直接退出就正常显示了.注意修改ss,sp之 ...

  2. js 正则学习小记之匹配字符串

    原文:js 正则学习小记之匹配字符串 今天看了第5章几个例子,有点收获,记录下来当作回顾也当作分享. 关于匹配字符串问题,有很多种类型,今天讨论 js 代码里的字符串匹配.(因为我想学完之后写个语法高 ...

  3. 多项式快速插值学习小记

    今天终于抽空把这个综(du)合(liu)知识点学了,心力交瘁-- 多项式快速插值 给出 nnn 个点 (xi,yi)(x_i,y_i)(xi​,yi​) ,要求一个次数为 n−1n-1n−1 的多项式 ...

  4. 多项式的ln、exp、快速幂和开根学习小记

    不妨又学习了一下多项式的求ln.exp.快速幂和开根操作. 这些操作比之前的求逆更上了一层台阶,应用同样很广. 多项式求逆等知识在我的博客里有讲:多项式的求逆.取模和多点求值学习小记 多项式ln 给出 ...

  5. 积性函数与Dirichlet卷积 学习小记

    前言 首先感谢 XHM 大佬的悉心指导,我懂得了不少~. 链一下他关于这方面的见解.博客--XHM 的Dirichlet卷积 学习小记 一些定义 回归正题,这次我学习了一下狄利克雷卷积方面的知识. 先 ...

  6. js 正则学习小记之左最长规则

    js 正则学习小记之左最长规则 原文:js 正则学习小记之左最长规则 昨天我在判断正则引擎用到的方法是用 /nfa|nfa not/ 去匹配 "nfa not",得到的结果是 'n ...

  7. python 温度 符号_【火马】Python学习小记01

    Python 学习小记 Life is short,you need Python! 写在前面 自从重新拾起2016年开始注册的公众号"火马编程",我就把TA当作了自己的一块&qu ...

  8. 8086汇编学习小记-1

    8086汇编学习小记-1 View Code assume cs : codesg, ds : datasg, ss : stacksgdatasg SEGMENT... datasg ENDSsta ...

  9. java基础小记_[Java教程]Java基础学习小记

    [Java教程]Java基础学习小记 0 2016-10-07 18:00:07 题外话:总结了多年的学习心得,不得不说,睡眠是一个学习者的必需品!所谓"早起毁一天"不是没有道理哪 ...

最新文章

  1. jqgrid本地数据例子_微型数据转换器如何通过更小尺寸为您带来更多价值
  2. java学习(129):hashmap的方法
  3. 多特蒙德主题本地个人任务清单小demo,你值得尝试!
  4. Deep_Rank,经典ctr系列预估模型复现框架
  5. 数字图像处理matlab蔡利梅,数字图像处理:使用MATLAB分析与实现:using MATLAB
  6. DMG计算机,传授dmg文件怎么打开
  7. 【协议分析】WAP1.x协议栈浅析-WSP协议
  8. 论文泛读: 基于改进退化隐马尔可夫模型的设备健康诊断与寿命预测研究
  9. 网页设计_导航条_下拉菜单
  10. 【CVPR 2021】Revisiting Knowledge Distillation: An Inheritance and Exploration Framework
  11. C语言str函数系列
  12. python使用turtle库绘制一个100长度的十字架_哪个选项能够使用turtle库绘制一个半圆形?...
  13. C# Winform Socket即时通讯
  14. 少年三国志服务器关闭注册,少年三国志2服务器关闭注册 怎么登陆到老区
  15. HashMap的原理及扩容
  16. 无基础学Linux(4)——基本系统
  17. 人生感悟--条条经典
  18. 「季淳卿」零基础学习 MyBatis-Plus-springBoot(笔记总结)
  19. 中国的市场营销部到底是怎么分工的,每个人到底在干什么事?
  20. SSL-TLS 双向认证:SSL-TLS 工作原理

热门文章

  1. 记账APP:小哈记账1——欢迎页的制作
  2. 服务器怎么设置2个账号密码忘记了怎么办啊,腾讯云服务器管理员账号密码如何重置...
  3. 1575-我想满手鲜血(思路+LIS)
  4. mysql索引btree hash_Hash索引和BTree索引
  5. 小众免费的短视频素材库
  6. 关于处理无法保存打印机设置的问题
  7. golang net包tcp超时设置并判断是否超时
  8. 【前端实例代码】Html5+css3创建拟物风格昏昏欲睡的云朵动画网页效果~前端开发网页设计基础入门教程~适合初学者~超简单~
  9. php用户登录唯一登录怎么写,PHP实现会员账号单唯一登录的方法分析
  10. 通过简单api对接,免费制作查题公众号