【算法•日更•第二十八期】图论:强连通+Tarjan算法(一)
▎前言
一直都想学习这个东西,以为很难,结果发现也不过如此。
只要会些图论的基础就可以了。
▎强连通
☞『定义』
既然叫强连通,那么一定具有很强的连通性。
强连通:就是指在一个有向图中,两个顶点可以互相到达,那么我们就称之为强连通;
强连通图:在一个有向图中,任意两个点都可以互相到达,那么我们称这个图是一个强连通图;
强连通分量:在一个有向图中(不一定是强连通图),一定有很多子图是强连通图,特别的,单独的一个点也是强连通图,而强连通分量则是分成的最大的强连通图。
以下三个红框中的都是强连通分量:
☞『dfs&有向图』
图的遍历如果使用dfs的话,就会形成一棵树的样子。
原理很简单,从任意一个顶点出发,不断扩展,已经遍历过的那么就不再遍历了,直到无法继续遍历(也可能有点会不连接)。
其中这棵树当前节点扩展出的边与这棵树之间有很多关系。
因此在了解了这些之后,我们还得弄清楚一些概念:
假设当前节点为u。
①树枝边:就是u所扩展出的边,且没有访问过;
②前向边:指向DFS树中子树中节点的边;
③后向边:指向DFS树中父亲的边;
④横叉边:指向DFS树中非子树的边。
☞『关系的判定』
首先规定一下:当前节点为u,扩展节点为v,low数组存储的是当前节点及其子树的离根节点最近的节点编号,dfn数组存储的是当前节点被访问的序号。
请看下面的图:
当前节点编号是5,那么:
①树枝边:A边还没有访问过,为树枝边;
②前向边:B边的dfn[v]>dfn[u],说明在子树中,那么这是一条前向边;
③后向边:C边已经访问过了,不在子树中且在栈中,所以这是一条后向边;
④横叉边:D边已经访问过且不在子树中,且已经出栈,所以是一条横叉边。
▎Tarjan算法
☞『什么是Tarjan算法?』
一种由Robert Tarjan提出的求解有向图强连通分量的线性时间的算法。
Tarjan算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一棵子树。搜索时,把当前搜索树中未处理的节点加入一个堆栈,回溯时可以判断栈顶到栈中的节点是否为一个强连通分量。(copy自百度)
☞『算法核心』
对于一条边(u,v),我们在之前的讲解中已经提到了dfn和low数组的意思。
那么初始状态下:low[u]=dfn[u],这应该很好想,初始状态下离根节点最近的节点编号先赋值为自己遍历的编号,和并查集的初始化类似。
每一次扩展时,若边为树枝边,那么我们就使用low[v]来更新low[u],如果是后向边,那么我们就使用dfn[v]来更新。
当low[u] == dfn[u]时,就是一个分割点,要把u之后入栈的元素及u全部弹出栈。
可能有些难理解,推荐一篇别人的博客,图解画得很好,链接在此。
当然,问tarjan算法也会告诉你图解的,小编就不画了。
【算法•日更•第二十八期】图论:强连通+Tarjan算法(一)的更多相关文章
- 【算法•日更•第三十七期】A*寻路算法
▎写在前面 这是一种搜索算法,小编以前总是念成A乘寻路算法,没想到一直念错. 请大家都念成A星寻路算法,不要像小编一样丢人了. ▎A*寻路算法 ☞『引入』 相信大家都或多或少的玩过一些游戏吧,那么游戏 ...
- 【算法•日更•第十九期】动态规划:RMQ问题
▎前言 首先先来说一下RMB是什么,当然是人民币啦. 今天我们要学的这个东西不一般,叫做RMQ问题,那么它和RMB有什么关系呢?待小编细细说来. ▎前置技能:动态规划 不会的同志请戳这里迅速了解动态规 ...
- 【算法•日更•第二十三期】数据结构:two-pointer(尺取法)&莫队
▎引入 ☞『例题』 一道十分easy的题: 洛谷P1638 长度为n的序列,m种数 找一个最短区间,使得所有数出现一遍 n≤1e6 ,m≤2e3. ☞『分析』 这道题非常的简单,但是如果不会two-p ...
- 【算法•日更•第二期】查找算法:三分VS二分
▎前言:函数 如果你已经上过初二的数学课了,那么你十有八九会被函数折磨到吐血,这是一种中考压轴题类的题目,往往分类讨论到你恶心.不过没学过也不打紧,现场讲解一下: ☞『数学中的函数』 一般地,如果在一 ...
- 【算法•日更•第十期】树型动态规划&区间动态规划:加分二叉树题解
废话不多说,直接上题: 1580:加分二叉树 时间限制: 1000 ms 内存限制: 524288 KB提交数: 121 通过数: 91 [题目描述] 原题来自:NOIP 20 ...
- 【算法•日更•第二十七期】基础python
▎前言 看到这个题目,你一定会很好奇,为什么学打NOIP的要学习python?其实python对我们是很有用的! NOIP虽然不支持使用python提交代码,但是在NOILinux上天生自带pytho ...
- 【算法•日更•第十二期】信息奥赛一本通1585:【例 1】Amount of Degrees题解
废话不多说,直接上题: 1585: [例 1]Amount of Degrees 时间限制: 1000 ms 内存限制: 524288 KB提交数: 130 通过数: 68 [ ...
- 【算法•日更•第四十七期】Mac与windows系统的差别
小编最近装了个Mac系统,因为小编已经有笔记本可以用linux了,所以就决定在台式机上装个双系统,结果一不小心把Mac装在C盘上了,哎,说多了都是泪啊. 其实用了Mac之后才发现windows特别好用 ...
- 【算法•日更•第五十七期】快速傅里叶变换(FFT):从入门到放弃
▎一些用的上的东西 小编太菜了,很多东西都不会证明(主要是三角函数还没有学啊~~~). 附上链接https://blog.csdn.net/enjoy_pascal/article/details/8 ...
随机推荐
- Winform开发中的困境及解决方案
在我们开发各种应用的时候,都会碰到很多不同的问题,这些问题涉及架构.模块组合.界面处理.共同部分抽象等方面,我们这里以Winform开发为例,从系统模块化.界面组件选择.业务模块场景划分.界面基类和辅 ...
- SAS X option
1. SAS X选项就是调用DOS命令. 例子: option noxwait;/*黑窗口执行完命令后自动关闭*/ %let path =.; %let filter=*.lst; X “ dir & ...
- Java8线程池ThreadPoolExecutor底层原理及其源码解析
小侃一下 日常开发中, 或许不会直接new线程或线程池, 但这些线程相关的基础或思想是非常重要的, 参考林迪效应; 就算没有直接用到, 可能间接也用到了类似的思想或原理, 例如tomcat, jett ...
- python的常用模块
一.random随机数模块 使用随机数模块需要导入随机数模块import random 1.random.random() 生成[0,1)之间的随机小数 2.random.randint(a,b) 生 ...
- Java Script 数组
数组:有许多变量的集合,它们的名称和数据类型都是一致的. 定义 操作(添加修改) Var arr=new Array(): Var arr=[ ]; //定义 Var arr1=[ 1,2,3, ...
- ken桑带你读源码之scrapy downloadermiddlewares
downloadermiddlewares 文件夹是下载中间件 其中 process_request 还没请求时的处理函数 process_response 请求之后的处理函数 chunke ...
- jmeter调试元件Debug Sampler的使用
@@@@@@@@@@@@@@@ 活在当下 今天记录一下jmeter调试工具Debug Sampler的心得,调试对于计算机从业人员来说是家常便饭,jmeter虽然代码不多,但是也需要调试,那么如何进行 ...
- dp最长不下降序列
// // Created by snnnow on 2020/4/13. // //这是dp 问题的基础题 // //最长不下降 //(导弹拦截是其例题) //那这篇文章是讲啥呢, // 主要是吧, ...
- API返回延迟,FPM重启后恢复之后又重现 问题解决方案
背景 最近在提供后台API时,提供了一个简单逻辑的接口 部署在测试环境,自测没问题,提交测试 突然有一天,接口响应延迟严重,几乎每次都是3-4秒返回 这对于一个接口来说,肯定是有问题的 于是便有了以下 ...
- 女生学Java编程是什么感受?
那我就代表女生来说说感受 在编程的世界很难遇到好看的帅哥 记得当年15年7月4号是我实习生入职的日子,因为是校企合作,所以没有面试.老师推荐.直接入职.刚来北京第一个感觉就是人多,还有就是热.刚到公司 ...