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 ...
随机推荐
- pandas,apply并行计算的一个demo
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2018-10-11 17:55:26 # @Author : Sheldon (thi ...
- Linux下监视GPU、CPU的使用情况
1.在运行Tensorflow等程序时会使用到NVIDIA的GPU,所以在程序运行时需要监控GPU的运行情况 使用 nvidia-smi 命令 ,显示如下: nvidia-smi 显示解读: GPU: ...
- linux字符设备学习笔记【原创】
1.申请设备号 int register_chrdev_region(dev_t from, unsigned count, const char *name) 指定从设备号from开始,申请coun ...
- SpringCloud与Dubbo区别
为什么放弃Dubbo 使用SpringCloud? 相同点:SpringCloud 和Dubbo可以实现RPC远程调用框架,可以实现服务治理. 不同点: SpringCloud是一套目前比较网站微服务 ...
- Spring Boot2.0之全局捕获异常
全局捕获异常,很明显的错误404返回给客户,很不好呀.整个web请求项目全局捕获异常,比如空指针直接返回给客户啊,那多操蛋呀~ 看这几个常用的注解: @ExceptionHandler 表示拦截异常 ...
- html5基本格式
html5基本格式 学习要点: HTML5 文档的基本格式 2. 开发工具的基本操作 一. 文档基本格式 <!DOCTYPE html> 文档声明,告诉计算机这是一个HTML5文档. ...
- kvm初体验之三:vm的安装及管理
Host: CentOS release 6.4 (Final) Guest: CentOS release 6.6 (Final) 全程以root身份操作 1. host上创建桥br0 参考< ...
- c语言字符串 数字转换函数大全
最近学数据结构老是做实验 常用到字符串和数字的转换 想找却发现网上的资料太散 所以搜集整理一下 方便以后再用 atof(将字符串转换成浮点型数) atoi(将字符串转换成整型数) atol(将字符串转 ...
- ThreadPoolExecutor线程池进阶使用
一.简介 线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为: ThreadPoolExecutor(int corePoolSize, int ...
- 微软面试题:鸡蛋从第N层及以上的楼层落下会摔破
from:https://blog.csdn.net/qq_18425655/article/details/52326709 题目: 有一栋楼共100层,一个鸡蛋从第N层及以上的楼层落下来会摔破 ...