-拓撲排序學習
a.簡述拓撲排序:說是排序 其實根本不是根據單個資料本身而建立的排序 而是根據資料與資料之間的聯絡而排序
如果遇到一系列的問題:要求a事件要在b事件前完成 b事件要在d事件後完成....諸如此類就要找到abcd...之間的發生先後次序
拓撲排序就是解決此類問題的
這裡介紹到乙個專有名詞依賴解析 此類問題就叫做依賴解析
b.拓撲的前提
拓撲排序適用於dag(有環無向圖)中 否則會出現 迴圈依賴/無依賴 關係
當且僅當乙個有向圖為有向無環圖(directed acyclic graph,或稱dag)時,才能得到對應於該圖的拓撲排序。每乙個有向無環圖都至少存在一種拓撲排序。該論斷可以利用反證法被證明如下:
假設我們有一由v_1到v_n這n個結點構成的有向圖,且圖中v_1,v_2,...,v_n這些結點構成乙個環。這即是說對於所有1≤i,圖中存在一條有向邊從v_i指向v_i+1。同時還存在一條從v_n指向v_1的邊。假設該圖存在乙個拓撲排序。
那麼基於這樣乙個有向圖,顯然我們可以得知對於所有1≤i,v_i必須在v_i+1之前被遍歷,也就是v_1必須在v_n之前被遍歷。同時由於還存在一條從v_n指向v_1的邊,v_n必須在v_1之前被遍歷。這裡出現了與我們的假設所衝突的結果。因此我們可以知道,該圖存在拓撲排序的假設不成立。也就是說,對於非有向無環圖而言,其拓撲排序不存在。
c.拓撲排序實現思路:
根據前文 我們要找最先做的事件設為a 所以對於a來說沒有其他事件指向它(因為是dag 所以一定存在事件a) 也就是該事件的入度為0 當我們完成a事件時 就要刪去a指向的事件(因為此時a已經完成 a指向的事件沒有與a事件的關係束縛)繼續找入度為0的事件....直到整張圖被搜完結束
d.拓撲排序演算法描述:
//這樣可以判斷乙個圖是否存在環
e.拓撲排序**實現:
1//topo sort;
2 #include 3
using
namespace
std;
4#define n 10000+1056
intin
[n];
7int
n,m;
89 queueq;//
需要字典序最小:priority_queue,greater> q; /整數q;
10 vectoredge[n];
11void
topo()
12 25}
26if (ans.size()==n)
2733
else printf("
no answer!");
34}
3536
intmain()
3747
topo();
48return0;
49 }
//ps:還了解到了有反向拓撲之類的套路題 之後會update
拓撲排序學習筆記
1.拓撲排序只對於有向無環圖而言 directed acyclic graph簡稱dag 2.在乙個有向無環圖中,若a b c,則拓撲序列為 a,b,c 也就是說如果一條邊a b,那麼在拓撲序列裡a就在b前面 知道了這兩點,那麼就可以來求拓撲序列了 首先,我們知道在dag中一定存在乙個入度為0的點,...
拓撲排序學習筆記
1.輸出字典序最小的拓撲序 在bfs演算法方法中用優先佇列 2.題意 n個點m條邊 dag 求刪去每個點後1 n最短路 n,m 3e5 做法 首先在dag中可以跑拓撲排序,跑完拓撲排序有什麼好處呢?拓撲序上的乙個點k作為劃分線,前半段的點的集合設為x,後半段點的集合設為y,那麼從點1到x中的任意乙個...
學習筆記 拓撲排序
有向圖的拓撲序列 給定乙個n個點m條邊的有向圖,點的編號是1到n,圖中可能存在重邊和自環。請輸出任意乙個該有向圖的拓撲序列,如果拓撲序列不存在,則輸出 1。若乙個由圖中所有點構成的序列a滿足 對於圖中的每條邊 x,y x在a中都出現在y之前,則稱a是該圖的乙個拓撲序列。輸入格式 第一行包含兩個整數n...