拓撲排序(簡述)

2021-09-07 08:36:02 字數 1744 閱讀 7656

拓撲排序是乙個比較常用的圖論演算法,經常用於完成有依賴關係的任務的排序。

舉個慄 例子:有人想要製作一件工具,但是這個工具不是一次就可以完成的,分很多個步驟,而且這些步驟是有順序的,也就是說,假設b的順序在a的後面,那麼你就必須要先完成a再完成b,但是也有些步驟不分順序,意思是你先做哪乙個都是可以的。

面對這樣的問題,我們可以把步驟建立成一張有向無環圖,a指向b意思是a要在b前面完成,那麼下面,我們就要找到乙個順序,來使答案符合題目要求。拓撲排序就是幹這樣的事情的。

拓撲排序實現思路:先從第乙個沒有入度的節點開始(如果有多個則任意),將此點放入佇列中,並且刪除與之有關的邊,再重複上述步驟,直到所有的點全部進入佇列,此時輸出即可。

拓撲排序**實現:

#include#define maxn 517

using namespace std;

int g[maxn][maxn];

int ds[maxn];

int ans[maxn];

int n, m, x, y;

int i, j;

void tp();

void init();

int main()

tp();

for(i=1;i上面我們講了拓撲排序的實現,下面來看兩道例題。

t1:hdu4109

題意:有n個指令m個要求 例如 x y z 代表 指令y必須在指令x後 z秒執行 輸出cpu執行的最小時間。

分析:乙個裸的拓撲排序,中間記得加上安全時間(z)即可。

**:#includeusing namespace std;

const int maxn = 1005;

int a, b;

struct edge ;

vectorg[maxn];

int indeg[maxn];

int mint[maxn];

queueque;

void tp();

int main()

tp();

for(int i=0;it2:hdu4857

題意:不可能的,本來題目就是中文的。

分析:比t1還要簡單的拓撲排序,不會的話就再好好學習學習拓撲排序吧。 反向建邊,為了序號小的盡量在前面,每次取入度為0的最大的點。

**:#include#include#include#include#include#include#include#includeusing namespace std;

struct list

edge[110000];

int head[33000];

int nums;

void add(int u,int v,int w)

int du[33000];

void init()

priority_queueque;

vectorvec;

int n;

void dos()

while(!que.empty())

}vec.push_back(x);

}for(int i=n-1;i>=0;i--)

cout<

}int main()

dos();

}return 0;

}

python 拓撲排序 Python 拓撲排序

python 拓撲排序 在圖論中,由乙個有向無環圖的頂點組成的序列,當且僅當滿足下列條件時,稱為該圖的乙個拓撲排序 英語 topological sorting 每個頂點出現且只出現一次 若a在序列中排在b的前面,則在圖中不存在從b到a的路徑。print 拓撲排序結果 g.topologicalso...

python 排序 拓撲排序

在電腦科學領域中,有向圖的拓撲排序是其頂點的先行排序,對於每個從頂點u到頂點v的有向邊uv,在排序的結果中u都在v之前。如果圖是有向無環圖,則拓撲排序是可能的 為什麼不說一定呢?圖論 是組合數學的乙個分支,它和其他分支比如 群論 拓撲學 矩陣論有著密切的關係。圖是圖論的主要研究物件。圖是由若干給定的...

拓撲排序演算法

對許多資料結構教材實在不滿意,至少我是看不懂 至於拓撲排序演算法,教材上那些偽 真真教人頭暈。只寫了幾個struct結構,我根本看不出這是鄰接表。如果給出乙個清晰明了的圖,一切不就簡單了?總之,關鍵就是建立乙個鄰接表。然後利用這個表進行拓撲排序。邊表結點宣告 typedef struct edgen...