考研複試系列 第八節 拓撲排序

2021-07-27 23:37:43 字數 1930 閱讀 2527

前言拓撲排序最適於解決判斷乙個有向圖是不是有向無環圖的問題。在考研機試中也是經常出現的,但是題目又各不相同,只要抓住問題的根本,

即拓撲排序判斷有向無環圖的本質就可以以不變應萬變。本節依然和前面依然,側重於說明演算法的程式設計實現。

拓撲排序——kahn

看了網上其他的資料大多是以圖的變化講解拓撲排序,並沒有說明演算法實現的過程,所以下面以**的形式來說明演算法的過程以及如何把**的

轉換過程實現為具體的演算法。

給出這樣乙個圖,我們知道它的拓撲排序序列是1 2 3 4 或者 1 3 2 4 。但是在演算法實現中具體該如何實現這個過程呢?

我們先使用自然語言藐視整個過程。首先建立這樣乙個**:

開始時節點的入度初始化為0,後繼節點也是空。

現在假設輸入一條邊 1—>2  (邊的先後輸入順序不影響的),ok 開始更新這個**,輸入邊是1到2,所以2的入度加1,1的後繼節點加入節點2,此時**如下:

然後依次其他的邊,最終**如下:

然後我們就開始基於這個**進行處理。然後我們掃瞄一遍入度,如果入度為0,說明對應節點沒有前驅,那就把它加入到乙個佇列中(其實用棧什麼的都可以):

ok,接下來取佇列中的隊頭元素,也就是節點1 ,並將其出佇列,然後查表它的後繼節點是2和3 ,於是將2和3的入度都減去1 ,並判斷節點2和3的入度是否是0,若是0則加入佇列(顯然因為節點2和3的入度發生了改變,所以我們只需要判斷節點2和3的入度就可以了)此時**以及隊列為:

然後採取和前面一樣的策略,從佇列中彈出隊頭元素即節點2 ,查表其後繼為節點4,將節點4的入度減去1,判斷是否為0,不為0不做操作,繼續從佇列中取出

節點3,查表其後繼為節點4,將節點4的入度減去1,判斷是否為0,這是4的入度為0了,於是將節點4加入佇列。

然後從佇列中取隊頭元素即節點4,查表沒有後繼了,然後發現佇列是為空了,於是演算法結束。

下面我們來程式設計實現:思考一下,入度我們可以使用乙個陣列來記錄,後繼節點我們可以使用鍊錶,為了方便我們使用vector陣列來替代鍊錶。佇列直接使用

stl中的queue就好了。

#include#include#include#includeusing namespace std;

vectornext[101];//儲存某節點的後繼

queueq;//佇列

int innode[101];//記錄節點的入度

int main()

while(!q.empty())//清空

q.pop();

for(i=1;i<=m;i++)//輸入邊資訊

int cnt = 0;//用於累加已經確定拓撲序列的結點個數

for(i=1;i<=n;i++)//將入度為0的節點加入佇列

while(!q.empty())//佇列非空則重複執行

{ //取隊頭節點並彈出

int now = q.front();

q.pop();

cnt++;//確定乙個節點總數加1

for(i=0;i

第八節 函式

函式的特性 減少 重複 使程式變得可擴充套件 使程式變得易維護 乙個函式只做一件事情 變數作用域 python 中,程式的變數並不是在哪個位置都可以訪問的,訪問許可權決定於這個變數是在 賦值的。變數的作用域決定了在哪一部分程式可以訪問哪個特定的變數名稱。python的作用域一共有4種,分別是 以 l...

編譯原理 第八節

分為兩大類 自頂向下分析 和 自底向上分析 其中前者又細分為 遞迴下降分析法 包含回溯的遞迴下降分析法和不含回溯的遞迴下降分析法 和非遞迴的 分析法 ll分析法 後者分為算符優先分析法和lr分析法。思想 從語法的開始符號出發,試探使用不同產生式,尋找匹配於輸入符號串的推導。或者說,從對應文法開始符號...

第八節 觸發器

上節中學到了quartz 如何解析corn like 表示式,其實觸發器中最核心的地方就是處理時間,這一節讓我們來了解下quartz中的觸發器有哪些吧 我想大家一定首先想到的就是處理corn like的觸發器吧,它就是crontriggerimpl觸發器,還是看一下類圖,看看有多少觸發器,和它們之間...