拓撲排序的DFS和BFS

2022-08-17 01:45:19 字數 1638 閱讀 7415

博主以前有乙個疑問,dfs和bfs各自的適用範圍是?我想你今天看了這篇文章之後會有乙個判斷!

**風格被我改為了c++

void topsort(vector

> g)

topnum[v]=counter;//第counter+1個被遍歷到的

for(int i;iif(g[v][i])

indgree[i]--;}}

}

用一句話來概括這個演算法就是依次尋找出入度為0的點,然後將其所通的所有點入度都減1。迴圈直至結束或者報錯(有環)。

上面這個演算法存在優化的餘地,findvertexindgreezero()的複雜度為o(n),執行n次為o(n2)次,用乙個佇列會大大縮減複雜度

void topsort(vector

> g)

while(!q.empty())}}

if(counter!=g.size())

cout

<<"有環"

《這個結果很有趣,我們可以不嚴謹地總結一下「拓撲排序就是在找入度0點+更新入度」。

題外話

另外topnum[i]儲存了遍歷的順序。那麼能不能topnum[counter]=i,這樣呢。。也可以。因為i和counter肯定是一一對映的關係。如果學習過資料庫,那麼你就可以說:誰來做主鍵都可以。

劉汝佳 演算法競賽入門經典第二版

p167

假設有n個變數,m個二元組(u,v),分別表示u< v。那麼尋找乙個不等式,包含所有的變數。類似於a< b,b< c ,則輸出a< b< c;

我們可以把二元組小於關係看作邊關係。這一轉換其實很自然

然後,尋找乙個不等式,其實就是在尋找乙個拓撲順序。那麼,這個問題其實就是乙個拓撲排序,完全可以用bfs完成

但是還有另外一種比較有趣的解法,就是使用dfs

我們首先定義乙個函式

bool dfs(int u);//u代表當前點,返回點u之後是否存在乙個拓撲路線

有了這個定義就不難繼續做下去了,我們再想到:當前點u若是想能夠返回true,那麼它所能到達(u->v)的所有點也應該都能。

那麼,失敗的具體條件是什麼?就是成環

只要之後遍歷到的點和之前的點u有關係(v->u),那麼就說明成環!返回false。

那麼,**應該是:

int

vector

> g

int c[maxn];

int topnum[maxn];

int t;

bool dfs(int u)

if(!c[i]&&!dfs(i)) return

false;

}//經過了檢驗

c[u]=1;

topnum[--t]=u;

return

true;

}

bool topsort()

拓撲排序的DFS和BFS

博主以前有乙個疑問,dfs和bfs各自的適用範圍是?我想你今天看了這篇文章之後會有乙個判斷!風格被我改為了c void topsort vector g topnum v counter 第counter 1個被遍歷到的 for int i iif g v i indgree i 用一句話來概括這個...

TopSort 拓撲排序 中DFS和BFS的應用

深度優先搜尋 下面圖中的數字顯示了深度優先搜尋頂點被訪問的順序。為了實現深度優先搜尋,首先選擇乙個起始頂點並需要遵守三個規則 1 如果可能,訪問乙個鄰接的未訪問頂點,標記它,並把它放入棧中。2 當不能執行規則1時,如果棧不空,就從棧中彈出乙個頂點。3 如果不能執行規則1和規則2,就完成了整個搜尋過程...

拓撲排序(dfs用棧,bfs用佇列)

現在你總共有 n 門課需要選,記為 0 到 n 1。在選修某些課程之前需要一些先修課程。例如,想要學習課程 0 你需要先完成課程 1 我們用乙個匹配來表示他們 0,1 給定課程總量以及它們的先決條件,返回你為了學完所有課程所安排的學習順序。可能會有多個正確的順序,你只要返回一種就可以了。如果不可能完...