資料結構之拓撲排序

2021-08-14 05:09:16 字數 1589 閱讀 5887

一、什麼是拓撲排序

在圖論中,拓撲排序(topological sorting)是乙個有向無環圖(dag, directed acyclic graph)的所有頂點的線性序列。且該序列必須滿足下面兩個條件:

每個頂點出現且只出現一次。

若存在一條從頂點 a 到頂點 b 的路徑,那麼在序列中頂點 a 出現在頂點 b 的前面。

有向無環圖(dag)才有拓撲排序,非dag圖沒有拓撲排序一說。

例如,下面這個圖:

它是乙個 dag 圖,那麼如何寫出它的拓撲排序呢?這裡說一種比較常用的方法:

從 dag 圖中選擇乙個 沒有前驅(即入度為0)的頂點並輸出。

從圖中刪除該頂點和所有以它為起點的有向邊。

重複 1 和 2 直到當前的 dag 圖為空或當前圖中不存在無前驅的頂點為止。後一種情況說明有向圖中必然存在環。

於是,得到拓撲排序後的結果是 。

通常,乙個有向無環圖可以有乙個或多個拓撲排序序列。

二、拓撲排序的實現

根據上面講的方法,我們關鍵是要維護乙個入度為0的頂點的集合。

圖的儲存方式有兩種:鄰接矩陣和鄰接表。這裡我們採用鄰接表來儲存圖,c++**如下:

#include

#include

#include

using

namespace

std;

/************************類宣告************************/

class graph

;/************************類定義************************/

graph::graph(int v)

graph::~graph()

void graph::addedge(int v, int w)

bool graph::topological_sort()

if(count < v)

return

false; // 沒有輸出全部頂點,有向圖中有迴路

else

return

true; // 拓撲排序成功

輸出結果是 4, 5, 2, 0, 3, 1。這是該圖的拓撲排序序列之一。

每次在入度為0的集合中取頂點,並沒有特殊的取出規則,隨機取出也行,這裡使用的queue。取頂點的順序不同會得到不同的拓撲排序序列,當然前提是該圖存在多個拓撲排序序列。

由於輸出每個頂點的同時還要刪除以它為起點的邊,故上述拓撲排序的時間複雜度為o(v+e)。

文章**

資料結構之拓撲排序

乙個簡單的求拓撲排序思路是 先找出任意乙個沒有入邊的頂點。然後列印出該頂點,並將它和它的邊一起從圖中刪除。然後,我們對圖的其餘部分採用同樣的方法處理。相應的我們可以定義乙個indegree 入度陣列 儲存所有頂點的入度。具體實現如下 鄰接表 define crt secure no warnings...

資料結構之拓撲排序

拓撲排序 topological order 是指,將乙個有向無環圖 directed acyclic graph簡稱dag 進行排序進而得到乙個有序的線性序列。這樣說,可能理解起來比較抽象。下面通過簡單的例子進行說明!例如,乙個專案包括a b c d四個子部分來完成,並且a依賴於b和d,c依賴於d...

資料結構之拓撲排序

感覺重點就是鄰接表的建立和tp toposort 函式中的乙個變數 的變化很奇妙,相當於是乙個靜態指標的用法。include include include include include include include include include define inf 0x3f3f3f3f d...