import java.util.ArrayList; import java.util.Iterator;// topo.java // demonstrates topological sorting // to run this program: C>java TopoApp //////////////////////////////////////////////////////////////// class Vertex { public String label; public Vertex(String lab) { label = lab; } } public class GraphSort { private final int MAX_VERTS = 40; private Vertex vertexList[]; // list of vertices private int adjMat[][]; // adjacency matrix private int nVerts; // current number of vertices private String sortedArray[]; public GraphSort() { vertexList = new Vertex[MAX_VERTS]; // adjacency matrix adjMat = new int[MAX_VERTS][MAX_VERTS]; nVerts = 0; for (int j=0; j 0) // while vertices remain, { // get a vertex with no successors, or -1 int currentVertex = noSuccessors(); if (currentVertex == -1) // must be a cycle { System.out.println("ERROR: Graph has cycles"); return null; } // insert vertex label in sorted array (start at end) sortedArray[nVerts-1] = vertexList[currentVertex].label; deleteVertex(currentVertex); // delete vertex } // end while // vertices all gone; String[] s2 = new String[orig_nVerts]; for (int j=0; j 0 ) // if edge to { // another, isEdge = true; break; // this vertex } // has a successor } // try another if( !isEdge ) // if no edges, return row; // has no successors } return -1; // no such vertex } // end noSuccessors() public void deleteVertex(int delVert) { if (delVert != nVerts-1) // if not last vertex, { // delete from vertexList for (int j=delVert; j" ); System.out.println(""); } public static void mainOld(String[] args) { GraphSort theGraph = new GraphSort(); theGraph.addVertex("A"); // 0 theGraph.addVertex("B"); // 1 theGraph.addVertex("C"); // 2 theGraph.addVertex("D"); // 3 theGraph.addVertex("E"); // 4 theGraph.addVertex("F"); // 5 theGraph.addVertex("G"); // 6 theGraph.addVertex("H"); // 7 theGraph.addEdge(0, 3); // AD theGraph.addEdge(0, 4); // AE theGraph.addEdge(1, 4); // BE theGraph.addEdge(2, 5); // CF theGraph.addEdge(3, 6); // DG theGraph.addEdge(4, 6); // EG theGraph.addEdge(5, 7); // FH theGraph.addEdge(6, 7); // GH String[] ret = theGraph.topologicalSort(); // do the sort print(ret); } // end main() public static void main(String[] args) { ArrayList levels = new ArrayList(); levels.add("L1"); levels.add("L2"); levels.add("L3"); levels.add("L5"); levels.add("L7"); ArrayList hier1 = new ArrayList(); hier1.add("L1"); hier1.add("L2"); hier1.add("L3"); ArrayList hier2 = new ArrayList(); hier2.add("L7"); hier2.add("L3"); hier2.add("L5"); ArrayList hiers = new ArrayList(); hiers.add(hier1); hiers.add(hier2); GraphSort theGraph = new GraphSort(); for (Iterator it = levels.iterator(); it.hasNext();) { String level = (String) it.next(); theGraph.addVertex(level); } for (Iterator it = hiers.iterator(); it.hasNext();) { ArrayList hier = (ArrayList) it.next(); String prevLevel = null; for (Iterator hit = hier.iterator(); hit.hasNext();) { String level = (String) hit.next(); if (prevLevel != null) { int end = levels.indexOf(level); int start = levels.indexOf(prevLevel); theGraph.addEdge(start, end); System.out.println("adding edge start=" + start + " end=" + end); } prevLevel = level; } } String[] sortedArray = theGraph.topologicalSort(); // do the sort print(sortedArray); } // end main() }