@SuppressWarnings("unchecked")
	// we know our array is of the correct type
	public Set<Vertex>[] assignVerticesToStrongComponents() {
		DepthFirstSearch dfsa = new DepthFirstSearch(this, this.getSources(), true, true, false);
		DepthFirstSearch dfsb =
			new DepthFirstSearch(this, dfsa.topologicalSort(), true, false, true);
		//Err.debug(this, "The number of SCCs is " + dfsb.seedsUsed.size());
		Set<Vertex> sccSeeds = new HashSet<>(dfsb.seedsUsed());
		Set<Vertex>[] sccVertices = new Set[sccSeeds.size()]; // triggers unchecked warning
		Vertex[] finishOrder = dfsb.topologicalSort();
		int n = finishOrder.length;
		int j = 0;
		for (int i = 0; i < sccSeeds.size(); i++) {
			sccVertices[i] = new HashSet<>(1);
			do {
				//Err.debug(this,  Long.toHexString(finishOrder[j].getName() ) + " ");
				sccVertices[i].add(finishOrder[j++]);
			}
			while ((j < n) && !sccSeeds.contains(finishOrder[j]));
			//Err.debug(this, " | ");
		}
		return sccVertices;
	}
Returns an array of Sets (HashSet). Each set contains the vertices
 within a single strongly connected component of the DirectedGraph.

A strongly connected component of a directed graph is a subgraph 
in which it is possible to find a directed path from any vertex to any 
other vertex in the graph. A cycle is a simple example of strongly 
connected graph.
Ghidra/Framework/Generic/src/main/java/ghidra/util/graph/DirectedGraph.java