AOV網的概念java
在一個有向圖中,若是用頂點表示活動,用弧表示活動間的前後順序,該有向圖稱爲頂點活動網絡,簡稱爲AOV網,有向無環圖 = 無環AOV網node
拓撲排序的概念算法
從一個有向無環圖,排出一個頂點的序列,對任一頂點,其前驅都出如今它的前面,其後繼都出如今它的後面。網絡
拓撲排序的算法測試
任選一個入度爲0的頂點,訪問之this
從圖中刪除此頂點,及它發出來的弧spa
重複前兩部,直到輸出全部頂點對象
java實現,首先咱們須要先構建一個有向無環圖排序
Graph graph = new Graph();
String nodeNames[] = {"aaa", "bbb", "ccc", "ddd", "eee", "fff", "ggg"};
for (String s : nodeNames) {
graph.nodes.add(new Node(s));
}rem
graph.arcs = new int[nodeNames.length][nodeNames.length];
graph.arcs[0][1] = 1;
graph.arcs[1][2] = 1;
graph.arcs[3][4] = 1;
graph.arcs[4][2] = 1;
graph.arcs[2][5] = 1;
graph.arcs[6][5] = 1;
爲了方便你們理解,畫了一張圖
而後是拓撲排序的java實現,具體流程再也不贅述,說幾個須要注意的點
一、由於過程中涉及到刪除,這裏用一個map把原圖的全部頂點裝起來,key爲頂點順序,value爲頂點對象
二、須要用一個set把全部已刪除頂點記錄下來
三、對邊的刪除,並無真的執行刪除操做,只是在查找入度的時候,把已刪除頂點都忽略掉。
public void sortAOV(){
int visitedCnt = 0;
Map<Integer, Node> newNodeMap = new HashMap<>();
for (int i = 0; i < this.nodes.size(); i ++){
newNodeMap.put(i, this.nodes.get(i));
}
Set<Integer> cutedIndexSet = new HashSet<>();
while(visitedCnt < this.nodes.size()){
for (int i : newNodeMap.keySet()){
if (this.getID(i, cutedIndexSet) == 0){
this.nodes.get(i).visit();
visitedCnt ++;
newNodeMap.remove(i);
cutedIndexSet.add(i);
break;
}
}
}
}
private int getID(int i, Set<Integer> cutedIndexSet){
int res = 0;
for (int j = 0; j < this.nodes.size(); j ++){
if (!cutedIndexSet.contains(j) && arcs[j][i] > 0) {
res ++;
}
}
return res;
}
下面是輸出:
aaa
bbb
ddd
eee
ccc
ggg
fff
還能夠測試一下非連通的狀況,把頂點ggg,設爲不跟任何其餘頂點鄰接,測試結果爲:
aaa
bbb
ddd
eee
ccc
fff
ggg
正確!