欢迎光临
我们一直在努力

求有向的强连通分量例题,强连通分量是有向中的极大强连通子

强连通分量个数的求法(图解) 背景

最近刷软考题的时候,碰到2013年上半年软件设计师的第31题,求程序图的环路复杂度。答案解析中有这么一段话:

根据图论,在一个强连通的有向图G中,环的个数V(G)由以下公式给出:
V ( G ) = m ? n + 2 p ( ? ) V(G)=m-n+2p(*) V(G)=m?n+2p(?)
其中,V(G)是有向图G中的环路数,m是图G中弧的个数,n是图G中的结点数,p是图G中的强连通分量个数。

因为一直习惯了用V=m-n+2的公式计算,所以刚看到(*)公式时有点反应不过来,算是自己学习上的一个盲点,所以把强连通分量个数的求法拿出来简要通俗地整理一下,供大家参考,如有理解错误的,欢迎指出^ v ^。

强连通分量(SCC)的求法:

在有向图G中,如果对于每一对vi、vj,vi≠vj,从vi到vj和从vj到vi都存在路径,则称G是强连通图。有向图中的极大强连通子图称做有向图的强连通分量

求强连通分量个数的前提,你需要先知道深度优先搜索(DFS),百度百科介绍得挺好的,不了解的可以先看一下。

了解了深度优先搜索(DFS)后,下面我们正式开始求强连通分量,为了更直观了解,我们将下图G作为例子进行讲解:

对G进行图的转置(对所有边转向),得到下图GT

对GT进行DFS,并找出每个结点开始和结束的时间(T开始/T结束),从而根据结束时间从大到小排序得出相应的排序F。这里从结点1开始进行DFS:

由图可见,DFS遍历的顺序是135462,按结束时间从大到小排序可得序列F为213546

根据序列F对原图G进行DFS:

遍历2,结点2自成一个强连通分量{2}
遍历1,结点1自成一个强连通分量{1}
遍历3,子图{3456}为一个强连通变量

也就是说这个强连通图G有三个强连通分量。

结尾

重新回到背景,2013年上半年软件设计师上午试题的第30题中,求的是程序图的环路复杂度,虽然程序总是连通的,但并不是强连通的。为了能够使用公式(*),采用从程序出口到入口添加一条用虚线(不计入m)表示的有向边,使程序图变成强连通图,此时程序图每个结点之间都互相连通,p=1。

16174510

赞(0)
【声明】:本博客不参与任何交易,也非中介,仅记录个人感兴趣的主机测评结果和优惠活动,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。