博主以前有乙個疑問,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 給定課程總量以及它們的先決條件,返回你為了學完所有課程所安排的學習順序。可能會有多個正確的順序,你只要返回一種就可以了。如果不可能完...