有向無環圖的應用-拓撲排序算法及實現

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

正確!

相關文章
相關標籤/搜索