拓撲排序是乙個比較常用的圖論演算法,經常用於完成有依賴關係的任務的排序。
舉個慄 例子:有人想要製作一件工具,但是這個工具不是一次就可以完成的,分很多個步驟,而且這些步驟是有順序的,也就是說,假設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...