C++学习笔记:有向图的强连通分量

强连通图分量

首先得知道这是个什么玩意儿,对于一个如下的有向图

在这个有向图G中,如果有两个点可以相互到达,则两点为强连通,若图中每个点都可以相互到达,则图G为强连通图

1. 一个有向图是强连通的,而且仅当G中有一条回路,它至少包含每个点一次

2. 非强连通图的极大强连通子图,称为强连通分量,孤立的点也是一个强连通分量

(copy课件不解释)

 


实现方法

1. Kosaraju算法

(1)首先DFS遍历一遍图,在DFS回溯中标记点,得到一个后序遍历的表

(2)一个原图G的反图R,按 1 中的表DFS遍历

(3)在 2 中,用了多少次DFS,就有多少个强连通分量

为什么可以这样实现,可以理解为如果点 i 和点 j 强连通,则 i 可以到 j,j 可以到 i,则在反图中也可以相互到达

#include <iostream>
#include <cstdio>
#include <cm
posted @ 2019-05-31 13:55  Nomad_Joe_violet  阅读(25)  评论(0编辑  收藏  举报  来源