m_stronglyConnectedSearchTreeList.add( copySearchTree(j.next(), g));
m_stronglyConnectedSearchTreeList.add(copySearchTree(j.next(), t));
	public void findStronglyConnectedComponents(GraphType g,		GraphToolkit<GraphType, EdgeKey, VertexKey, EdgeType, VertexType> toolkit) {		// Perform the initial depth first search		DepthFirstSearch<GraphType, EdgeKey, VertexKey, EdgeType, VertexType> initialDFS =			new DepthFirstSearch<GraphType, EdgeKey, VertexKey, EdgeType, VertexType>();		if (m_vertexChooser != null)			initialDFS.setVertexChooser(m_vertexChooser);		initialDFS.search(g);		// Create a transposed graph		Transpose<GraphType, EdgeKey, VertexKey, EdgeType, VertexType> t =			new Transpose<GraphType, EdgeKey, VertexKey, EdgeType, VertexType>();		GraphType transpose = t.transpose(g, toolkit);		// Create a set of vertices in the transposed graph,		// in descending order of finish time in the initial		// depth first search.		VisitationTimeComparator<VertexType> comparator =			new VisitationTimeComparator<VertexType>(initialDFS.getFinishTimeList(),										  VisitationTimeComparator.DESCENDING);		Set<VertexType> descendingByFinishTimeSet = new TreeSet<VertexType>(comparator);		Iterator<VertexType> i = transpose.getVertexIterator();		while (i.hasNext()) {			descendingByFinishTimeSet.add(i.next());		}		// Now perform a DFS on the transpose, choosing the vertices		// to visit in the main loop by descending finish time		DepthFirstSearch<GraphType, EdgeKey, VertexKey, EdgeType, VertexType> transposeDFS =			new DepthFirstSearch<GraphType, EdgeKey, VertexKey, EdgeType, VertexType>();		if (m_vertexChooser != null)			transposeDFS.setVertexChooser(m_vertexChooser);		transposeDFS.search(transpose, descendingByFinishTimeSet.iterator());		// The search tree roots of the second DFS represent the		// strongly connected components.  Note that we call copySearchTree()		// to make the returned search trees relative to the original		// graph, not the transposed graph (which would be very confusing).		Iterator<SearchTree<VertexType>> j = transposeDFS.searchTreeIterator();		while (j.hasNext()) {			m_stronglyConnectedSearchTreeList.add(				copySearchTree(j.next(), g));		}	}