【算法•日更•第二十八期】图论:强连通+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 ...
随机推荐
- 《Python测试开发技术栈—巴哥职场进化记》—前言
写在前面 今年从4月份开始写一本讲Python测试开发技术栈的书,主要有两个目的,第一是将自己掌握的一些内容分享给大家,第二是希望自己能系统的梳理和学习Python相关的技术栈.当时我本来打算以故事体 ...
- 题解 洛谷 P3298 【[SDOI2013]泉】
考虑到年份数很小,只有 \(6\),所以可以 \(2^6\) 来枚举子集,确定流量指数对应相同的位置,然后通过哈希和排序来计算相同的方案数. 但是这样计算出的是大于等于子集元素个数的方案数,所以还需要 ...
- WBF交易所如何使用二次验证码/谷歌身份验证器
一般点账户名——设置——安全设置中开通虚拟MFA两步验证 具体步骤见链接 WBF交易所如何使用二次验证码/谷歌身份验证器 二次验证码小程序于谷歌身份验证器APP的优势 1.无需下载app 2.验证码 ...
- Monster Audio 使用教程 (七) 防止声音过大,出现爆音
有用户反映,如果音乐音量过大,会出现爆音. 这其实是音频信号过载了.只要最后输出的音量超过0db,就会出现爆音,这是数字音频都应该注意的问题. 所以,为了解决这个问题,限制器就出现了,它能把音频信号压 ...
- APP自动化 -- TouchAction(触屏)
- set自动排序去重 stringstream流分割字符
链接:https://vjudge.net/problem/UVA-10815#author=0 题意:给几段句子,按字典序筛选出单词. 题解:用C的话太麻烦,不如用自动去重并排序的set容器.有个地 ...
- 分布式锁-Redis方案
#!/usr/bin/env python # coding=utf-8 import time import redis class RedisLock(object): def __init__( ...
- js:事件(注册、解绑、DOM事件流、事件对象、事件委托)
1.注册事件 (1)传统方式注册事件 <body> <button id="b1">请点击</button> <script> va ...
- 最长不下降代码dp
我看以前写过一个最长不下降,但是感觉可能没有那么好理解emmmm 下面这个是从正序寻找的emmmm 先来一个WA代码,我给写了WA的具体行数,看看其他行其实可以看出它的思路 第二个代码是AC的 #in ...
- vmware15虚拟机安装教程
自己碰到的问题:本人win7 64位旗舰版系统.之前用VMware12pro版本的软件,在安装Ubuntu18.04之后,有时候开启Ubuntu虚拟机时有点问题,重启就可以了.但是不稳定,所以改用VM ...