tarjan求强连通分量的思考
我是按照这里的思路来的。这个博文只是感性理解。
递归树
关于递归树,这篇博文讲的很好,我只是给自己总结一下。
定义vis数组,在dfs连通图时赋予它们不同的含义:
- vis=0,表示这个点没有被访问。
- vis=1,表示这个点被访问了,但是它的孩子还没有访问完。
- vis=2,表示这个点被访问了,并且它的孩子访问完了。
一个连通图,一定可以表示成一个递归树,加上一些边。这些边的种类有:
- 树边,也就是递归树上的边。表现为访问(u, v)时,\(vis[v]=0\)。
- 回边,是一个点连向它递归树上的祖宗的边。表现为\(vis[v]=1\)。
- 前向边,是一个点连向它递归树上的子孙后代的边。表现为\(vis[v]=2\)。
- 横边,是一个除了前三种边以外的边,也就是说u和v没有什么祖宗关系。表现为\(vis[v]=2\)。
一个强连通的东西,必定在一棵递归树上,不会分散到多个上。不然那东西就不连通了,想要强连通更是不可能。
对了,如果将dfs访问到的时间,给递归树上的点编号,一个点的祖先的编号一定比这个点小。
tarjan搞一次出栈的一定是一个强连通的东西
还记得tarjan里,判断一个点是否出栈的依据吗?就是\(dfn[u]=low[u]\)。这意味着在u的子结点中,没有回往u以上的边,不然\(low[u]<dfn[u]\)。所以根据tarjan算法,如果u出栈,出栈的东西中编号最小的就是u。出栈的东西应该类似于这样(没画有向边,所以脑补吧):
也就是说,一个节点只有间接连向u,才能和u组成一个强连通的东西。这导致强连通分量在递归树上,其实就是一堆链的集合体,也就是树。
重点来了。如果tarjan搞出来的东西中,有一些点不和其它点强连通,说明它不能间接连向u,而是会间接连向u的一个儿子v。如果\(low[v]<dfn[v]\),这个点又可以间接连向\(low[v]\)...,以此类推,最终连向一个可以出栈的点,那个点u的是儿子。这就证明了,一次出栈搞出来的东西,和u都是强连通的。
tajan一次搞出来的,一定是一个强连通分量
这个标题和前面哪一个的区别是什么呢?就是一个是“东西”,一个是“分量”。分量意味着它大的不能再大了。所以这里要证明(弥天大雾,其实我这个根本不算证明)的,就是一次tarjan搞出来的,最小结点为u的强连通分量中,不会有其它点被遗漏。至于这个证明,我贴一个引用过来:
假设出栈的部分不完整,则本应该在这次出栈的点可能存在于栈的哪些部分呢?
1.之前出栈的部分
2.还没有入栈的部分
3.还没有出栈的部分
首先看2,不可能。因为假如没有入栈,说明这些点没有在这棵深度优先搜索树中,假如这些点在本该在该强连通分量中,则和定理1相违背,所以情况2中不可能包含本应该出栈的强连通分量中的点。再看3,也不可能。3中的点的dfn 和 low都分别小于本次出栈的点的dfn和low,也就说明本次出栈的点都无法访问到还没有出栈的点,所以情况3中不可能包含本应该出栈的强连通分量中的点。最后看情况1,其实情况1和情况3是类似的,之前出栈的部分A如果和本次出栈的强连通分量B可以组成更大的强连通分量,这就等价于,以之前出栈的强连通分量A为视角,亦是说A是不完整的,A中缺少的部分在还未出栈的节点和还没有访问的节点之中。这和之前的情况2,情况3推导矛盾,所以,情况1也不可能。
tarjan求强连通分量的思考的更多相关文章
- UESTC 901 方老师抢银行 --Tarjan求强连通分量
思路:如果出现了一个强连通分量,那么走到这个点时一定会在强连通分量里的点全部走一遍,这样才能更大.所以我们首先用Tarjan跑一遍求出所有强连通分量,然后将强连通分量缩成点(用到栈)然后就变成了一个D ...
- tarjan求强连通分量+缩点+割点以及一些证明
“tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄> 自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...
- Tarjan求强连通分量,缩点,割点
Tarjan算法是由美国著名计算机专家发明的,其主要特点就是可以求强连通分量和缩点·割点. 而强联通分量便是在一个图中如果有一个子图,且这个子图中所有的点都可以相互到达,这个子图便是一个强连通分量,并 ...
- tarjan求强连通分量+缩点+割点/割桥(点双/边双)以及一些证明
“tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄> 自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...
- HDU 1827 Summer Holiday(tarjan求强连通分量+缩点构成新图+统计入度+一点贪心思)经典缩点入门题
Summer Holiday Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- CCF 高速公路 tarjan求强连通分量
问题描述 某国有n个城市,为了使得城市间的交通更便利,该国国王打算在城市之间修一些高速公路,由于经费限制,国王打算第一阶段先在部分城市之间修一些单向的高速公路. 现在,大臣们帮国王拟了一个修高速公路的 ...
- UVALive 4262——Trip Planning——————【Tarjan 求强连通分量个数】
Road Networks Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Stat ...
- tarjan求强连通分量(模板)
https://www.luogu.org/problem/P2341 #include<cstdio> #include<cstring> #include<algor ...
- Tarjan求强连通分量、求桥和割点模板
Tarjan 求强连通分量模板.参考博客 #include<stdio.h> #include<stack> #include<algorithm> using n ...
随机推荐
- PopupWindow 实现 查看所有手机应用弹出框
public class MainActivity extends Activity implements OnItemLongClickListener, OnClickListener { pri ...
- 3 《锋利的jQuery》jQuery中的DOM操作
DOM操作分(1)DOM Core(核心):document.geElementsByTagName("form");/ element.getAttribute("sr ...
- Ubuntu/CentOS下使用脚本自动安装 Docker
Ubuntu.Debian 系列安装 Docker 系统要求 Docker 支持以下版本的 Ubuntu 和 Debian 操作系统: Ubuntu Xenial 16.04 (LTS) Ubuntu ...
- Contiki源码结构
Contiki源码结构 apps目录下,用于存放Application,也就是我们的应用程序放在这个目录下.如webserver,webrowser等,如下图所示. core目录是contiki操作系 ...
- VLAN虚拟局域网技术(二)-计算机网络
本文主要知识来源于学校课程,部分知识来自于H3C及思科中国公司网页技术手册,未经许可,禁止转载.如需转载,请联系作者并注明出处. 本节主要是总结一些思科的VLAN组中的私有协议:DTP和VTP. 1. ...
- 单页导航菜单视觉设计HTML模板
单页导航菜单视觉设计HTML模板,视觉,企业,html,单页,单页导航菜单视觉设计HTML模板是一款磨砂背景的大气时尚HTML设计网页模板 http://www.huiyi8.com/moban/
- flash滑杆控制图片横向滚动
flash滑杆控制图片横向滚动是一款FLASH动画图片左右滚动素材,滑杆控制滚动,效果很酷,带FLASH源文件. 下载:http://www.huiyi8.com/sc/9452.html
- html5--1.5 文本元素
html5--1.5 文本元素 学习要点: 掌握常用的文本元素 文本元素,就是讲一段文本设置成相匹配的结构和含义 1.b元素: 我的作用就是 加粗文字: 2.br元素: 我的作用就是强制换行: 3.i ...
- python-多线程2-线程同步
线程同步: 一个场景: 一个列表里所有元素都是0,线程A从后向前把所有元素改成1,而线程B负责从前往后读取列表并打印. 那么,可能线程A开始改的时候,线程B便来打印列表了,输出就变成一半0一半1,这就 ...
- BZOJ_1999_[Noip2007]Core树网的核_单调队列+树形DP
BZOJ_1999_[Noip2007]Core树网的核_单调队列+树形DP Description 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T ...