拓扑排序的算法
拓撲排序的算法
package ToPu;public class Graph {private final int MAX_VERTS = 20;private Vertex vertexList[];private int adjMat[][];private int nVerts;private char sortedArray[];public Graph(){vertexList = new Vertex[MAX_VERTS];adjMat = new int [MAX_VERTS][MAX_VERTS];nVerts = 0;for(int j = 0;j<MAX_VERTS;j++){for(int k=0;k<MAX_VERTS;k++){adjMat[j][k] = 0;}}sortedArray = new char [MAX_VERTS];}//添加頂點的方法public void addVertex(char label){vertexList[nVerts++] = new Vertex(label);}//添加邊的方法public void addEdge(int start,int end){adjMat[start][end]= 1;}//打印點的方法public void displayVertex(int v){System.out.print(vertexList[v].label+" ");}public void topo(){//統計一下有多少個點int orig_Vertex = nVerts;while(nVerts > 0){//找到一個沒有后繼的節點int currentVertex = noSuccessors();if(currentVertex == -1){//一定是個環System.out.println("圖中有環");return ;}//在這個數組中插入一個點sortedArray[nVerts-1] = vertexList[currentVertex].label;//在圖中刪除這個點deleteVertex(currentVertex);}System.out.println("輸出拓撲排序的結果");for(int j=0;j<orig_Vertex;j++){System.out.print(sortedArray[j]+" ");}System.out.println();}/*** 在這個圖中刪除該頂點* @param currentVertex*/private void deleteVertex(int delVert) {//如果刪除的不是數組中最后一個點,就后面的元素直接向前面移動,覆蓋這個元素就行了。if(delVert != nVerts-1){for(int j=delVert;j < nVerts-1;j++){vertexList[j] = vertexList[j+1];}//從圖中刪除rowfor(int row=delVert;row<nVerts-1;row++){moveRowUp(row,nVerts);}//從圖中刪除colfor(int col=delVert;col<nVerts-1;col++){moveColLeft(col,nVerts-1);}}nVerts--;}private void moveColLeft(int col, int length) {for(int row = 0;row<length;row++){adjMat[row][col]=adjMat[row][col+1];}}private void moveRowUp(int row, int length) {for(int col=0;col<length;col++){adjMat[row][col] = adjMat[row+1][col];}}/*** 這個方法是找沒有后繼的節點* @return*/private int noSuccessors() {boolean isEdge;for(int row = 0;row < nVerts;row++){isEdge = false;for(int col =0;col < nVerts;col++){if(adjMat[row][col] > 0){isEdge = true;break;}}if(!isEdge){return row;}}return -1;}} =============================================== package ToPu;/*** 把一個圖中的所有的節點排序使得每一條有向邊(u,v)對應* 的u排在v的前面,* 拓撲排序的最大用途就是判斷一個有向圖是不是有環。* * 無前驅的頂點優先的拓撲排序方法* 該方法的每一步總是輸出當前無前驅(即入度為0)的頂點* 算法描述:* NonPreFirstTopSort(G){//優先輸出無前趨的頂點 while(圖G中有人度為0的頂點)do{ 從G中選擇一個人度為0的頂點v且輸出之; 從G中刪去v及其所有出邊; } if(輸出的頂點數目<|V(G)|) //若此條件不成立,則表示所有頂點均已輸出,排序成功。 Error("G中存在有向環,排序失敗!"); } 性質 1、 拓撲排序在有向無環圖中才能排出有效的序列,否則能判斷該有向圖有環。 2、如果輸入的有向圖中的點,不存在入度為0的點,則該有向圖存在回路 3、如果存在的入度為0的點大于一個,則該有向圖肯定不存在一個可以確定的拓撲序列但并不妨礙拓撲排序 * * * * * * **/public class Main {public static void main(String[] args) {Graph theGraph = new Graph();theGraph.addVertex('A');theGraph.addVertex('B');theGraph.addVertex('C');theGraph.addVertex('D');theGraph.addVertex('E');theGraph.addVertex('F');theGraph.addVertex('G');theGraph.addVertex('H');//添加邊theGraph.addEdge(0, 3);theGraph.addEdge(0, 4);theGraph.addEdge(1, 4);theGraph.addEdge(2, 5);theGraph.addEdge(3, 6);theGraph.addEdge(4, 6);theGraph.addEdge(5, 7);theGraph.addEdge(6, 7);theGraph.topo();}} ==================================== package ToPu;public class Vertex {public char label;public Vertex(char label){this.label = label;}}
轉載于:https://www.cnblogs.com/aicpcode/p/4263452.html
總結
- 上一篇: 王者荣耀古风游戏网名107个
- 下一篇: 表扬工作尽职的锦旗有哪些424条