public Vector<Vertex> getEntryPoints() {

		Vertex[] sources = this.vertices().getSources();
		Set<Vertex> entryPointSet = new TreeSet<>();
		Vector<Vertex> entryPoints = new Vector<>(sources.length);
		for (Vertex source : sources) {
			entryPointSet.add(source);
		}
		Set<Vertex> descendantsOfSources = this.getDescendants(sources);
		Set<Vertex> nonDescendants = this.vertices().toSet();
		nonDescendants.removeAll(descendantsOfSources);
		if (nonDescendants.size() > 0) {
			Vertex u, v = null;
			Vertex[] nonDescendantVertices = nonDescendants.toArray(new Vertex[0]);
			DirectedGraph g = this.inducedSubgraph(nonDescendantVertices);
			Iterator<Vertex> iter;
			Set<Vertex>[] strongComponents = g.assignVerticesToStrongComponents();
			int n = strongComponents.length;
			for (int i = 0; i < n; i++) {
				iter = strongComponents[i].iterator();
				if (iter.hasNext()) {
					u = iter.next();
					Set<Vertex> parents = this.getParents(u);
					while (iter.hasNext()) {
						v = iter.next();
						parents.addAll(this.getParents(v));
						if (v.key() < u.key()) {
							u = v;
						}
					}
					if (strongComponents[i].containsAll(parents)) {
						entryPointSet.add(u);
					}
				}
			}
		}
		Iterator<Vertex> iter = entryPointSet.iterator();
		while (iter.hasNext()) {
			entryPoints.add(0, iter.next());
		}
		return entryPoints;
	}
Returns a vector containing the entry points to a directed graph. An entry
 point is either a source (in valence zero) or the least vertex in a strongly
 connected component unreachable from any vertex outside the strongly
 connected component. Least is defined here to be the vertex with the smallest
 key.
Ghidra/Framework/Generic/src/main/java/ghidra/util/graph/DirectedGraph.java