拓撲排序演算法的乙個應用

2022-01-19 03:48:45 字數 2726 閱讀 8374

在visual studio .net中,乙個解決方案可以包含多個專案,乙個專案可以引用若干其它專案。編譯的時候,vs會自動確定每個專案的編譯順序。vs究竟是如何計算出這個順序的呢?

如果學習過資料結構,可以很容易回答出這個問題:拓撲排序(topological sort)。

上述介紹抽象,不如用實際案例來解釋一下。假如在vs中建立乙個mvc的解決方案xmedia,該解決方案包含的專案,以及專案之間的引用關係如下表所示:   

專案引用

xmedia

xmedia.controllers、xmedia.models、xmedia.logics、xmedia.commons

xmedia.controllers

xmedia.models、xmedia.logics、xmedia.commons

xmedia.models

xmedia.logics

xmedia.models、xmedia.commons

xmedia.commons

專案之間的引用關係,是一種依賴關係。如果專案a引用專案b,則表示a依賴b。所以,必須先編譯專案b,再編譯專案a。

根據經驗,我們可以得出上述專案的編譯順序依次是:xmedia.commons、xmedia.models、xmedia.logics、xmedia.controllers、xmedia。當然,也可以把前兩項對調一下。

專案和引用關係構成了一張有向圖圖,專案相當於有向圖中的頂點(vertex),引用關係相當於有向圖中的邊(edge),而專案的編譯順序就是乙個拓撲序列,產生該序列的演算法稱為拓撲排序演算法。

以下是專案引用關係的有向圖展示:

拓撲排序演算法的簡要描述:

(1) 從有向圖中選擇乙個出度為0的頂點並且輸出它。

(2) 從圖中刪去該頂點,並且刪去該頂點的所有邊。

(3) 重複上述兩步,直到剩餘的圖中沒有出度為0的頂點。

按照上述演算法,執行過程演示如下:

第一步 選擇 xmedia.commons節點

第二步 選擇xmedia.models節點

第三步 選擇xmedia.logics節點

第四步 選擇xmedia.controllers節點

第五步 選擇xmedia節點

接下來我們用c#實現**實現這個演算法。

由於拓撲排序是乙個應用很多的演算法,所以,我們將實現乙個通用的排序演算法。在這個通用的演算法中,我們將頂點之間的關係作為依賴關係。**如下:

using

system;

using

system.collections.generic;

using

system.linq;

namespace

//////

拓撲排序類。

/// public

class

topologicsort ;

if (item.dependences != null

) node.dependences = new list(item.dependences);

list.add(node);

}while (list.count > 0

) }

else

if (list.count > 0

) }}}

//////

拓撲節點類。

/// public

class

topologicnode

//////

獲取或設定依賴節點的鍵值列表。

/// public list dependences }}

測試**如下:

using

system;

using

system.collections.generic;

namespace

class

program },

new topologicnode()},

new topologicnode()},

new topologicnode(),

new topologicnode()

};//輸出拓撲排序的結果

topologicsort sort = new

topologicsort();

foreach (var key in

sort.orderby(nodes))

console.readline();}}

}

執行結果如下圖所示:

拓撲排序的應用

adjlist.h有向無環圖的鄰接表儲存結構 include include include define max vertex num 10 define max name 10 typedef char vertexdata max name typedef struct arcnode arc...

拓撲排序並且輸出乙個可能的序列

如題描述 根據給出的圖輸出乙個可能的拓撲序列。判斷能否進行拓撲排序的關鍵是圖是否存在環。這裡我們用陣列c的值表示頂點當前的狀態。0代表沒有被訪問過,1代表正在被訪問,1代表該點及其子孫均被訪問過,並且是不存在的環的點。那麼我們用dfs去遍歷,如果該點在被訪問的過程中再次被訪問,則證明存在環。或者該點...

演算法學習 拓撲排序(佇列應用)

題目 分析 乙個節點沒有節點指向 即入度為0 的時候可以順利輸出,如果有則不能。可以用鄰接矩陣的方式來儲存現有的圖,將某節點列下所有的相加後如果等於0這說明當前結點可輸出。這裡給出關鍵 和注釋 int graph 12 12 結點數為n,用鄰接矩陣graph n n 儲存邊權 int indegre...