日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

拓扑排序的算法

發布時間:2023/12/19 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 拓扑排序的算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

拓撲排序的算法

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

總結

以上是生活随笔為你收集整理的拓扑排序的算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。