定义:在一张有向图中,两个点可以相互到达,则称这两个点强连通;一张有向图上任意两个点可以相互到达,则称这张图为强连通图;非强连通图有极大的强连通子图,成为强联通分量。

如图,{1},{6}分别是一个强连通分量,{2,3,4,5}是一个强连通分量。而Tarjan算法可用于求解强连通分量。


Tarjan算法

Tarjan算法是基于深度优先搜索的算法,每个强连通分量都是搜索树中的一个子树。

实现:dfn[u]表示到u节点时的标记(时间戳),low[u]表示u所能走到的节点中,点的最小的次序号(dfn),每搜寻一个节点u,就把一个节点入栈,令dfn[u]=++it;low[u]=dfn[u]。u所连接的节点为v,若v已经被搜寻过,则low[u]=min(low[u],low[v])。若v没有被搜寻过,则dfs(v)low[u]=min(low[u],low[v])。搜寻完u所连接的所有的边后,若dfn[u]==low[u],则u这个点是该点所在强连通分量中编号最小的点。此时栈里的u节点上面的全部为该强连通分量的节点。

第一步:

点1有一条边指向2号点,而且2号点没有被遍历,dfs(2)。

第二步

2有一条边指向3,遍历三号点。

第三步:

3指向4,dfs(4)。

第四步:

dfs(5)。

第五步:

5号点存在两条边,两条边都要遍历,假设先走到2号点的边。因为2号点已经遍历过,所以直接比较即可,这时候要更新5号点的low。

第六步:

然后遍历6号节点。

第七步:

此时6号节点无法向外扩展节点,此时dfn[6]==low[6],因此6号节点就是一个强连通分量。弹出6号节点,回溯。此时图的遍历已经完成,所有的节点均已被打上标记。

第八步:

回溯到5号节点,low[5]!=dfn[5],继续回溯。

第九步:

回溯到4号节点,更新4号节点的low值。

第十步:

回溯到3号节点,更新3号的low值。

第十一步:

回溯到2号节点,此时low[2]==dfn[2],因此,栈中2号点上面的(包括2号点)全部在一个强连通分量中。将他们全部弹出。

第十二步:

回溯到1号节点,dfn[1]==low[1],因此1号节点也是一个强连通分量。弹出。

void tarjan(int u){
dfn[u]=++it;
low[u]=it;
for(int i=;i<tu[u].size();i++){
if(!in[tu[u][i]]){
in[tu[u][i]]=true;
s.push(tu[u][i]);
tarjan(tu[u][i]);
low[u]=min(low[u],low[tu[u][i]]);
}
else{
low[u]=min(low[u],low[tu[u][i]]);
}
}
if(low[u]==dfn[u]){
while(s.top()!=u){
s.pop();
}
s.pop();
}
}

强联通分量-tarjan算法的更多相关文章

  1. 有向图的强联通分量 Tarjan算法模板

    //白书 321页 #include<iostream> #include<cstdio> #include<cstring> #include<vector ...

  2. 强联通块tarjan算法

    http://poj.org/problem?id=1236第一问:需要几个学校存在软件,才能通过传递,使得所有的学校都有软件 用tarjan算法求出强联通分量后,将每个联通分量缩成一个点,那么问题1 ...

  3. [vios1023]维多利亚的舞会3<强联通分量tarjan>

    题目链接:https://vijos.org/p/1023 最近在练强联通分量,当然学的是tarjan算法 而这一道题虽然打着难度为3,且是tarjan算法的裸题出没在vijos里面 但其实并不是纯粹 ...

  4. POJ 2186-Popular Cows (图论-强联通分量Korasaju算法)

    题目链接:http://poj.org/problem?id=2186 题目大意:有n头牛和m对关系, 每一对关系有两个数(a, b)代表a牛认为b牛是“受欢迎”的,且这种关系具有传递性, 如果a牛认 ...

  5. POJ 3592 Instantaneous Transference(强联通分量 Tarjan)

    http://poj.org/problem?id=3592 题意 :给你一个n*m的矩阵,每个位置上都有一个字符,如果是数字代表这个地方有该数量的金矿,如果是*代表这个地方有传送带并且没有金矿,可以 ...

  6. POJ 3114 Countries in War(强联通分量+Tarjan)

    题目链接 题意 : 给你两个城市让你求最短距离,如果两个城市位于同一强连通分量中那距离为0. 思路 :强连通分量缩点之后,求最短路.以前写过,总感觉记忆不深,这次自己敲完再写了一遍. #include ...

  7. poj-3177(并查集+双联通分量+Tarjan算法)

    题目链接:传送门 思路: 题目要将使每一对草场之间都有至少两条相互分离的路径,所以转化为(一个有桥的连通图至少加几条边才能变为双联通图?) 先求出所有的桥的个数,同时将不同区块收缩成一个点(利用并查集 ...

  8. hdu 1269 (强联通分量Tarjan入门)

    迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  9. Tarjan的强联通分量

    求强联通分量有很多种. <C++信息学奥赛一本通>  中讲过一个dfs求强联通分量的算法Kosdaraju,为了骗字数我就待会简单的说说.然而我们这篇文章的主体是Tarjan,所以我肯定说 ...

随机推荐

  1. 为什么打开fiddler电脑就不能上网,关了就能正常打开了呢?

    因为打开fiddler是它修改浏览器走代理服务器,关掉fiddler之后,代理服务器已经关闭了.但是,但是浏览器的代理模式还没改回来,就是说浏览器还要通过代理访问站点,然而代理服务器已经没有了.打开浏 ...

  2. js一行代码解决各种IE兼容问题

    在网站开发中不免因为各种兼容问题苦恼,针对兼容问题,其实 IE给出了解决方案 Google也给出了解决方案 百度也应用了这种方案去解决IE的兼容问题 百度源代码如下 <!Doctype html ...

  3. Cent OS 6.4下安装JDK1.6

    步骤1:查看Linux自带的JDK是否已安装 (卸载CentOS已安装的JDK)  安装好的CentOS会自带OpenJDK,用命令"java -version"查看,会有下面的信 ...

  4. 查询当前局域网下所有IP和物理网卡地址

    WIN+R –> 打开cmd 键入 arp -a

  5. mysql,Can 't connect to local MySQL server through socket '/tmp/mysql.sock '(2) "

    # mysql -uroot -pEnter password:ERROR 2002 (HY000): Can't connect to local MySQL server through sock ...

  6. linux下面重启nfs报错:nfs-server.service:main process exited

    linux下面重启nfs报错:nfs-server.service:main process exited [root@dhcp-66-83-39 images]# service rpcbind s ...

  7. 区间修改区间求和cdq分治

    https://www.luogu.org/problemnew/show/P3372 #include<bits/stdc++.h> #define fi first #define s ...

  8. 使用pycharm 出现 interpreter field is empty 完美解决方法(转载 记录)

    使用pycharm 出现 interpreter field is empty 主要是因为你的电脑没有正确安装python或者安装python出错,重新下载安装覆盖就行 下载安装包:从Python的官 ...

  9. docker学习-lnmp+redis之搭建mysql容器服务

    一. 前期准备工作,创建配置文件目录,log文件目录,数据库DATA和WEB站点目录[root@T1 ~]# mkdir -p /lnmp/conf/{mysql,nginx,php} /lnmp/l ...

  10. mongo中用嵌套结构优势是什么

    首先需要知道,MongoDB是NoSQL中的一种,是不直接支持Join的,这是NoSQL的一个特点,不需要直接支持Join,可以将横向扩展以及性能做到更好. 但是这不等于说MongoDB不能做Join ...