一、基本概念

强连通图(Strongly Connected Graph)是指在有向图G中,如果对于每一对vi、vj,vi≠vj,从vi到vj和从vj到vi都存在路径,则称G是强连通图。

有向图中的极大强连通子图称做有向图的强连通分量。

连通分量:对于图G来的一个子图中,任意两个点都可以彼此到达,这个子图就被称为图G的连通分量(一个点就是最小的连通分量)

最大连通分量:对于图G的一个子图,这个子图为图G的连通分量,且是图G所有连通分量中包含节点数最多的那个,即为G的最大联通分量

时间戳:搜索时第几个搜索到这个点。

二、定理

定理:一个有向图G是强连通的,当且仅当G中有一个回路,它至少包含每个节点一次。

证明:

(1)充分性:如果G中有一个回路,它至少包含每个节点一次,则G中任两个节点都是互相可达的,故G是强连通图。

(2)必要性:如果有向图是强连通的,则任两个节点都是相互可达。故必可做一回路经过图中所有各点。若不然则必有一回路不包含某一结点v,并且v与回路上的个节点就不是相互可达,与强连通条件矛盾 。

三、算法

(1)Tarjan 算法

思想:

low,dfn。dfn表示这个点的时间戳,而low代表这个点所能到达的最小的时间戳,开始low都等于dfn,但会经过不断更新而减少。

从1节点进行深度优先搜索,途中用树(一个转化为栈的树)维护。

当遇到一个点时,有如下判断:

1、如果这个点没有访问过,就将这个点加入树(栈)

2、如果这个点访问过,且在树(栈)里,与这个点的low比较,更新自己的low

返回时更新low

当一个点遍历所有的边后这个点的low还是等于dfn,将个点及以上出栈,这个点及栈以上的点构成一个连通分量。

伪代码:

void tarjan(int 当前点)
{这个点的low=dfn=时间戳;将这个点入栈;标记这个点入栈;枚举这个点连接的所有边{如果目标点没有被访问过{tarjan(目标点);更新当前点的low; }  如果目标点被访问过{更新当前点的low; } }如果当前点的low==dfn{将这个点及栈以上的点出栈,标记成一个强连通分量; ans++; }
}

C++版本一

//in:时间戳下标//dfn[i]:i节点的时间戳//low[i]:i所能到达的最小的时间戳//vis[i]:i是否在栈里//head[i],next[i],to[i]:邻接表
void tarjan(int u)
{in++;dfn[u]=in;low[u]=in;S.push(u);vis[u]=1;for(int e=head[u];e;e=next[e]){if(!dfn[to[e]]){tarjan(to[e]);low[u]=min(low[to[e]],low[u]);}else if(vis[to[e]])low[u]=min(low[u],dfn[to[e]]);}if(low[u]==dfn[u]){while(!S.empty() && S.top()!=u){vis[S.top()]=0;S.pop(); } vis[u]=0;S.pop();ans++;}
}

(2)Korasaju 算法

四、例题

https://www.luogu.org/problemnew/show/P1726(题解:https://blog.csdn.net/weixin_43272781/article/details/89790404)

五、参考资料

https://www.cnblogs.com/five20/p/7594239.html

https://www.cnblogs.com/shadowland/p/5872257.html

强连通分量(Strongly_Connected_Components)相关推荐

  1. 极小连通子图和极大连通子图_强连通分量与拓扑排序

    前言 由于GacUI里面开始多处用上拓扑排序,我决定把之前瞎JB搞出来的算法换掉,换成个正式的.之前我自己弄了个写起来很简单的算法,然后每一处需要用到的地方我就重新做一遍.当然这样肯定也是不行的,我觉 ...

  2. Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)...

    转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2194090a96bbed2db1351de8.html 基本概念: 1.割点:若删掉某点后,原连通图 ...

  3. HDU4635(强连通分量+Kosaraju算法)

    题意:给出一个有向图,最多添加多少条边使这个图依然不是强连通图:当这个图是强连通图时,输出-1: 求解思路:强连通分量求解: 强连通图:在有向图中,任意节点除法都可以到达其余所有节点,则称为强连通图. ...

  4. poj3352(强连通分量)

    题意:添加多少边才能使这个无向图为双连通分量. 注意:双连通分量适用于无向图:而强连通分量适用于有向图.但是这两个概念都是一样的. #include<iostream> #include& ...

  5. poj2553(强连通分量)

    题意:给出有向图,图的底部是所有汇节点的子集,即,底部(G)={v∈V\x-∀w∈V:(v→w)⇒(w→v)},w在--里面G可以从v, v也可从w.让我们求有多少个点是绘点的问题. 思路:先求解出强 ...

  6. poj2186(强连通分量)

    思路:找出出度为0 的顶点,如果出度为0的顶点大于1,则解为零,否则解就是出度为零的顶点的连通分支数. 刚开始是没有理解这道题的,也是看了大神之后才理解的. 方法一: #include<iost ...

  7. poj1236(强连通分量)

    题意: (1).至少需要向多少个学校发放软件,要使这个网络中的所有学校都能得到软件 (2).至少需要添加多少条边,才能使这个网络成为一个强连通分量图. 思路:首先求解强连通分量,如果不是同一个强连通分 ...

  8. HDU5934(强连通分量)

    题意:主要在诈弹爆炸的范围内如果存在其他的诈弹,那么在周围的诈弹也将会被引爆,这样思路就可以想到强连通分量了: 思路:先求解强连通分量,在找到强连通分量时,也求解出这个强连通分量的最小费用mincos ...

  9. HDU2767(强连通分量+Kosaraju算法)

    题意:需要加多少边才能把一个图变成强连通分量 强连通图:在有向图中,任意节点除法都可以到达其余所有节点,则称为强连通图. 强连通分量:在非强连通图的有向图中,选取部分点为强连通图,该强连通子图称为强连 ...

最新文章

  1. Activex test contact failed to create control 未指定的错误 控件无法加载的原因
  2. ORACLE分页SQL语句
  3. 如何学会读论文?送你滑铁卢大学S. Keshav的三轮阅读法
  4. 常见测量矩阵的MATLAB实现
  5. c语言编程常见问题解答,C语言编程常见问题解答之常用函数的包含文件
  6. mysql主键设置after_mysql如何改变主键属性
  7. 地图定位的坐标和mapview中显示的当前位置信息不一致
  8. 选择要加载的插件有什么用_为什么/如何PPT形状圆角化,用好这个插件,画出更多神奇形状...
  9. 关于SO引用的过滤:abiFilters
  10. git 查看、创建、删除 本地,远程 分支
  11. linux支持ext2格式吗,linux正统标准文件系统ext2详解
  12. 低压电力线宽带载波通信互联互通技术规-总则
  13. TI DSP COFF->EABI输出格式切换
  14. 路由器的两个端口接在同一个交换机上_2个路由器怎么连接?
  15. 云科技网络验证源码_【原创】酸酸云科技-网络验证界面版注册机注入工具 V3.2...
  16. 察举科目-汉代察举制度的重要环节
  17. 知道焊缝长度如何确定节点板尺寸_必看!手把手教你如何看懂图纸
  18. 通过几道CTF题学习yii2框架
  19. 电商订单系统设计简析(一)
  20. 2021年淘宝双11跨店满减如何使用?

热门文章

  1. ad13批量安装元件库_ad16如何批量添加封装库?
  2. android 手机命令大全,adb 命令大全
  3. build 之前执行task_一次NPM前端项目的CI-Build速度优化
  4. 学习型php空间,补装修日记:学习型业主三大要素
  5. java handler null_java – 在调用之前,如何确保另一个Thread的Handler不为null?
  6. java删除不,Java文件不能删除,该怎么解决
  7. 犀牛重建曲面_犀牛建模渐消面处理
  8. 二十三、前端必学Node.js入门
  9. 服务器运行jupyter notebook,解决办法
  10. pyqt5 中QSS