C++学习笔记:图论——缩点详解
引言
缩点,哲学的东西,你必须拥有。。。
缩点
个人认为就是把一堆强连通的点( 即强连通分量 ),认作为一个点
强连通分量就是这里面的点可以相互到达(算是个环)
详解
一个有向图如下
可以看出有强连通分量 { 1 , 2 } , { 8 , 4 , 9 } , { 7 } , { 6 } , { 3 } , { 5 }
先走一波Tarjan,求出强连通分量
用一个 cnt 记录一下强连通分量的和
然后在Trjan中记录每个点所属强连通分量,以及一些sao操作
void Tarjan( int x ) {//求强连通分量,缩点
num ++ ;
DFN[x] = low[x] = num ;
S.push(x);
inS[x] = 1 ;
for(int i = 0 ; i < G[x].size() ; ++ i ) {
int s = G[x][i] ;
if( !DFN[s] ) {
Tarjan( s );
low[x]