in src/main/java/org/apache/commons/graph/scc/TarjanAlgorithm.java [55:92]
private static <V, E> void strongConnect( DirectedGraph<V, E> graph,
V vertex,
Map<V, TarjanVertexMetaInfo> verticesMetaInfo,
Stack<V> s,
Set<V> stronglyConnectedComponent,
Integer index )
{
TarjanVertexMetaInfo vertexMetaInfo = getMetaInfo( vertex, verticesMetaInfo );
vertexMetaInfo.setIndex( index );
vertexMetaInfo.setLowLink( index );
index++;
s.push( vertex );
for ( V adjacent : graph.getOutbound( vertex ) )
{
TarjanVertexMetaInfo adjacentMetaInfo = getMetaInfo( adjacent, verticesMetaInfo );
if ( adjacentMetaInfo.hasUndefinedIndex() )
{
strongConnect( graph, adjacent, verticesMetaInfo, s, stronglyConnectedComponent, index );
vertexMetaInfo.setLowLink( min( vertexMetaInfo.getLowLink(), adjacentMetaInfo.getLowLink() ) );
}
else if ( s.contains( adjacent ) )
{
vertexMetaInfo.setLowLink( min( vertexMetaInfo.getLowLink(), adjacentMetaInfo.getIndex() ) );
}
}
if ( vertexMetaInfo.getLowLink() == vertexMetaInfo.getIndex() )
{
V v;
do
{
v = s.pop();
stronglyConnectedComponent.add( v );
}
while ( !vertex.equals( v ) );
}
}