Kosaraju:
执行过程:在有向图G中,从A进行一次DFS(From A To B),然后再对GT(G的逆向图)进行一次DFS(From A To B),如果两次DFS都成功,则说明两次DFS所重复经过的点,都在同一个强连通分量上。
- void DFS1( int s )
- {
- int i;
- visited[s] = true;
- for( i = head[s] ; i != -1 ; i = edg[i].next )
- {
- if( !visited[edg[i].to] )
- { DFS1( edg[i].to ); }
- }
- sta.push( s );
- }
- void DFS2( int s )
- {
- int i;
- visited[s] = true;
- fam[s] = cnt;
- for( i = nhead[s] ; i != -1 ; i = nedg[i].next )
- {
- if( !visited[nedg[i].to] )
- { DFS2( nedg[i].to ); }
- }
- }