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] 
posted @ 2019-06-26 13:50  Nomad_Joe_violet  阅读(12)  评论(0编辑  收藏  举报  来源