·(點的)度:對於無向圖,和某個點相連的邊條數算法
·入度:對於有向圖,終點是該點的邊條數數組
·出度:對於有向圖,起點是該點的邊條數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); } } }