1. 程式人生 > >有向無環圖的拓撲排序(DFS實現)

有向無環圖的拓撲排序(DFS實現)

1.有向無環圖的拓撲排序

// enDegree表示每個頂點的入度,這個資料結構可以從圖的結構求出來
// graph是一個二維陣列,但是這個陣列不是圖的鄰接矩陣,graph[i][j]表示依賴於i的第j個元素的編號
// 在本文中,i依賴於j表達的意思是,拓撲排序中必須先輸出j,然後才能輸出i
int topSort(vector<vector<int>>& relayVec, vector<int>& enDegree) {
	queue<int> myQueue;
	for (int i = 0; i < enDegree.size
(); ++i) { if (enDegree[i] == 0){ myQueue.push(i); } } while(!myQueue.empty()){ int top = myQueue.front(); for(int i = 0;i<relayVec[top].size();++i){ // 所有依賴於編號為top的元素的入度減小1,如果減小後剛好為0,入隊 if(--enDegree(relayVec[top][i])==0) myQueue.push(relayVec[top][i]); } }

2. 演算法複雜度分析

上述拓撲排序中,第一次將入度為0的頂點新增到佇列中,複雜度為O(n), 隨後從迴圈中每彈出一個節點,就會尋找將依賴該節點的節點的入度減小1次,依賴關係被訪問一次,即訪問一條邊,整個流程下來,每個頂點及其相鄰的邊都僅僅被訪問1次,因此整體時間複雜度為O(m+n).