拓撲排序的原理和實現

2022-01-23 04:28:33 字數 1314 閱讀 3152

在圖論中,由乙個有向無環圖組成的序列,只要滿足下面兩種情況則稱為拓撲排序:

可以從這副圖中發現,如果按照dfs的思想,那麼其訪問結點的結果為 5,2,3,1,0,4,但是如果是拓撲排序的話,訪問結點的結果為5,4,2,0,1,3,類似於多叉樹的bfs

拓撲排序可用來解決什麼問題呢?比如說課程排序,編譯依賴,類似凡是涉及到相關順序的時間安排;還可以用來判斷一幅有向圖是否無環。

根據前面提供的思想,首先想到的就是bfs,但是需要在bfs的基礎上進行判斷,只有入度為0的結點才能加入到佇列中,其中每訪問乙個結點,則將該結點的入度減一。(因為多叉樹的結點不可能存在環,所以其的bfs就不用擔心入度的問題)

如果是按照dfs的思想,則需要在等待迭代完結點的連線鄰接點後再把當前結點壓入棧中。

#include #include #include #include #include using namespace std;

/** * 構建鄰接矩陣

*/class graph ;

graph::graph(int v) : v(v)

graph::~graph()

void graph::addedge(int start, int end)

void graph::_bfs_topological_sort(vector&result, queue&queue) }}

// 判斷是否有環(正常情況下所有結點此時的入度都為0)

for (int i = 0; i < v; i++)

}}void graph::bfs_topological_sort()

}vectorresult;

this->_bfs_topological_sort(result, queue);

for (auto itr = result.begin(); itr != result.end(); itr++)

}void graph::_dfs_topological_sort(int v, bool *visited, stack&stack)

else }}

}// 訪問完結點所有的臨街結點之後才加入到棧中

stack.push(v);

}void graph::dfs_topological_sort()

}while (!stack.empty())

};int main()

上面圖的表現形式為鄰接表,基本演算法是用bfsdfs來實現的;

拓撲排序原理和實現

轉至 拓撲排序,顧名思義,就是一種排序方法。這是一種什麼排序?這種排序的作用?然後怎麼去實現這種排序演算法?現在就讓我們仔細研究下。實際上,拓撲排序是一種圖論演算法,該演算法在 資料結構與演算法 一書中有涉獵。引用維基百科的定義 在圖論中,由乙個有向無環圖的頂點組成的序列,當且僅當滿足下列條件時,稱...

拓撲排序的原理與實現

拓撲排序顧名思義是一種排序演算法,它用於給有向圖排序。有向圖是由一組頂點和一組有方向的邊組成的圖,每條有方向的邊都連線著有序的一對頂點,因此a b代表a可以到達b,並不代表b就能到達a。拓撲排序的結果就是乙個有向圖的頂點序列 或稱為拓撲序列 想要學習 c 程式設計 就需要先學習 計算機導論 想要學習...

拓撲排序的原理分析

拓撲排序,顧名思義,就是一種排序方法。這是一種什麼排序?這種排序的作用?然後怎麼去實現這種排序演算法?現在就讓我們仔細研究下。實際上,拓撲排序是一種圖論演算法,該演算法在 資料結構與演算法 一書中有涉獵。引用維基百科的定義 在圖論中,由乙個有向無環圖的頂點組成的序列,當且僅當滿足下列條件時,稱為該圖...