算法詳解之拓撲排序

名詞解釋

·(點的)度:對於無向圖,和某個點相連的邊條數算法

·入度:對於有向圖,終點是該點的邊條數數組

·出度:對於有向圖,起點是該點的邊條數code

·(兩點間)路徑:從起點點依次沿着邊移動到下一個點,直到終點所通過的點和/或邊若未有向圖要求只能從邊的起點移動到邊的終點排序

·圈:從一個點出發到本身的路徑,經常被稱做環隊列

·有向無環圖(DAG):不含有環的有向圖qt

拓撲排序

·和數組的排序沒什麼關係class

·對DAG的頂點進行排序,結果要求top

  • 每一個頂點出現且僅出現一次移動

  • 對於頂點對(u,v),若排序後u在v前,則不存在v到u的路徑while

·能夠理解爲,可以到達某個頂點u的全部點都在u前面出現的一種訪問順序

·通常是隨着排序過程處理節點的信息,不須要顯式得出結果

算法流程

·先在建圖時記錄每一個點的入度

·創建一個隊列,把接下來須要訪問的點加入隊列

·最開始時全部入度爲0的點均可以訪問,加入隊列

·依次從隊列中取出每一個點u,枚舉其出邊,邊的終點設爲v

·此處進行各類u->v的信息更新

·由於u信息已經計算過了,至關於從圖中刪去u,將其v入度-1

·此時v若入度爲0則說明前置信息處理完成,加入隊列

代碼:

int ind[MAXN];
int d[MAXN];
int q[MAXN], qhead = 0, qtail = 0;

void topo() {
    for (int i = 1; i <= n; i++) {
        if (!ind[i]) q[qtail++] = i;
    }
    while (qhead != qtail) {
        int now = q[qhead++];
        for (int i = he[now]; i; i = ne[i]) {
            Edge &e = ed[i];
            d[e.to] = max(d[e.to], d[now] + 1);
            if (!--ind[e.to]) q.push_back(e.to);
        }
    }
}
相關文章
相關標籤/搜索