拓撲排序(三)之 Java詳解
阿新 • • 發佈:2018-12-31
/* * 拓撲排序 * * 返回值: * -1 -- 失敗(由於記憶體不足等原因導致) * 0 -- 成功排序,並輸入結果 * 1 -- 失敗(該有向圖是有環的) */ public int topologicalSort() { int index = 0; int num = mVexs.size(); int[] ins; // 入度陣列 char[] tops; // 拓撲排序結果陣列,記錄每個節點的排序後的序號。 Queue<Integer> queue; // 輔組佇列 ins = new int[num]; tops = new char[num]; queue = new LinkedList<Integer>(); // 統計每個頂點的入度數 for(int i = 0; i < num; i++) { ENode node = mVexs.get(i).firstEdge; while (node != null) { ins[node.ivex]++; node = node.nextEdge; } } // 將所有入度為0的頂點入佇列 for(int i = 0; i < num; i ++) if(ins[i] == 0) queue.offer(i); // 入佇列 while (!queue.isEmpty()) { // 佇列非空 int j = queue.poll().intValue(); // 出佇列。j是頂點的序號 tops[index++] = mVexs.get(j).data; // 將該頂點新增到tops中,tops是排序結果 ENode node = mVexs.get(j).firstEdge;// 獲取以該頂點為起點的出邊佇列 // 將與"node"關聯的節點的入度減1; // 若減1之後,該節點的入度為0;則將該節點新增到佇列中。 while(node != null) { // 將節點(序號為node.ivex)的入度減1。 ins[node.ivex]--; // 若節點的入度為0,則將其"入佇列" if( ins[node.ivex] == 0) queue.offer(node.ivex); // 入佇列 node = node.nextEdge; } } if(index != num) { System.out.printf("Graph has a cycle\n"); return 1; } // 列印拓撲排序結果 System.out.printf("== TopSort: "); for(int i = 0; i < num; i ++) System.out.printf("%c ", tops[i]); System.out.printf("\n"); return 0; }