在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...