Mega Code Archive

 
Categories / Java / Collections Data Structure
 

Topological sorting

class Vertex {   public char label;   public Vertex(char lab) {     label = lab;   } } public class GraphTS {   private final int MAX_VERTS = 20;   private Vertex vertexList[]; // list of vertices   private int matrix[][]; // adjacency matrix   private int numVerts; // current number of vertices   private char sortedArray[];   public GraphTS() {     vertexList = new Vertex[MAX_VERTS];     matrix = new int[MAX_VERTS][MAX_VERTS];     numVerts = 0;     for (int i = 0; i < MAX_VERTS; i++)       for (int k = 0; k < MAX_VERTS; k++)         matrix[i][k] = 0;     sortedArray = new char[MAX_VERTS]; // sorted vert labels   }   public void addVertex(char lab) {     vertexList[numVerts++] = new Vertex(lab);   }   public void addEdge(int start, int end) {     matrix[start][end] = 1;   }   public void displayVertex(int v) {     System.out.print(vertexList[v].label);   }   public void topo() // toplogical sort   {     int orig_nVerts = numVerts;      while (numVerts > 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;       }       // insert vertex label in sorted array (start at end)       sortedArray[numVerts - 1] = vertexList[currentVertex].label;       deleteVertex(currentVertex); // delete vertex     }     // vertices all gone; display sortedArray     System.out.print("Topologically sorted order: ");     for (int j = 0; j < orig_nVerts; j++)       System.out.print(sortedArray[j]);     System.out.println("");   }   public int noSuccessors() // returns vert with no successors (or -1 if no such verts)   {      boolean isEdge; // edge from row to column in adjMat     for (int row = 0; row < numVerts; row++) {       isEdge = false; // check edges       for (int col = 0; col < numVerts; col++) {         if (matrix[row][col] > 0) // if edge to another,         {           isEdge = true;           break; // this vertex has a successor try another         }       }       if (!isEdge) // if no edges, has no successors         return row;     }     return -1; // no   }   public void deleteVertex(int delVert) {     if (delVert != numVerts - 1) // if not last vertex, delete from vertexList     {       for (int j = delVert; j < numVerts - 1; j++)         vertexList[j] = vertexList[j + 1];       for (int row = delVert; row < numVerts - 1; row++)         moveRowUp(row, numVerts);       for (int col = delVert; col < numVerts - 1; col++)         moveColLeft(col, numVerts - 1);     }     numVerts--; // one less vertex   }   private void moveRowUp(int row, int length) {     for (int col = 0; col < length; col++)       matrix[row][col] = matrix[row + 1][col];   }   private void moveColLeft(int col, int length) {     for (int row = 0; row < length; row++)       matrix[row][col] = matrix[row][col + 1];   }   public static void main(String[] args) {     GraphTS g = new GraphTS();     g.addVertex('A'); // 0     g.addVertex('B'); // 1     g.addVertex('C'); // 2     g.addVertex('D'); // 3     g.addVertex('E'); // 4     g.addVertex('F'); // 5     g.addVertex('G'); // 6     g.addVertex('H'); // 7     g.addEdge(0, 3); // AD     g.addEdge(0, 4); // AE     g.addEdge(1, 4); // BE     g.addEdge(2, 5); // CF     g.addEdge(3, 6); // DG     g.addEdge(4, 6); // EG     g.addEdge(5, 7); // FH     g.addEdge(6, 7); // GH     g.topo(); // do the sort   } }