在圖論中,由乙個有向無環圖組成的序列,只要滿足下面兩種情況則稱為拓撲排序:
可以從這副圖中發現,如果按照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()
上面圖的表現形式為鄰接表,基本演算法是用bfs
和dfs
來實現的; 拓撲排序原理和實現
轉至 拓撲排序,顧名思義,就是一種排序方法。這是一種什麼排序?這種排序的作用?然後怎麼去實現這種排序演算法?現在就讓我們仔細研究下。實際上,拓撲排序是一種圖論演算法,該演算法在 資料結構與演算法 一書中有涉獵。引用維基百科的定義 在圖論中,由乙個有向無環圖的頂點組成的序列,當且僅當滿足下列條件時,稱...
拓撲排序的原理與實現
拓撲排序顧名思義是一種排序演算法,它用於給有向圖排序。有向圖是由一組頂點和一組有方向的邊組成的圖,每條有方向的邊都連線著有序的一對頂點,因此a b代表a可以到達b,並不代表b就能到達a。拓撲排序的結果就是乙個有向圖的頂點序列 或稱為拓撲序列 想要學習 c 程式設計 就需要先學習 計算機導論 想要學習...
拓撲排序的原理分析
拓撲排序,顧名思義,就是一種排序方法。這是一種什麼排序?這種排序的作用?然後怎麼去實現這種排序演算法?現在就讓我們仔細研究下。實際上,拓撲排序是一種圖論演算法,該演算法在 資料結構與演算法 一書中有涉獵。引用維基百科的定義 在圖論中,由乙個有向無環圖的頂點組成的序列,當且僅當滿足下列條件時,稱為該圖...