拓撲排序學習筆記

2021-09-29 10:35:47 字數 1516 閱讀 4371

1.拓撲排序只對於有向無環圖而言 (directed acyclic graph簡稱dag)

2.在乙個有向無環圖中,若a–>b–>c,則拓撲序列為 (a,b,c);也就是說如果一條邊a—>b,那麼在拓撲序列裡a就在b前面;

知道了這兩點,那麼就可以來求拓撲序列了;

首先,我們知道在dag中一定存在乙個入度為0的點,那麼這個點就是我們的起始點;根據這個點我們就可以通過bfs往後找,每找到乙個相連點,就把這一條邊刪去,怎麼刪呢?

比如我們從a點開始,發現a與b相連,我們就要把a–>b這條邊刪去,就是b的入度減一,當發現乙個點的入度為0時,就把這個點入隊,並且用容器存下這個點;所得的容器裡面的序列就是拓撲序列;

**實現十分簡單;

模板題:

給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環。

請輸出任意乙個該有向圖的拓撲序列,如果拓撲序列不存在,則輸出-1。

若乙個由圖中所有點構成的序列a滿足:對於圖中的每條邊(x, y),x在a中都出現在y之前,則稱a是該圖的乙個拓撲序列。

輸入格式

第一行包含兩個整數n和m

接下來m行,每行包含兩個整數x和y,表示存在一條從點x到點y的有向邊(x, y)。

輸出格式

共一行,如果存在拓撲序列,則輸出拓撲序列。否則輸出-1。

**:

#include

#define ll long long

#define pa pair

#define lson k<<1

#define rson k<<1|1

//ios::sync_with_stdio(false);

using

namespace std;

const

int n=

100010

;const

int m=

200100

;const ll mod=

1e9+7;

int n,m;

int cnt;

int head[n]

;struct nodeedge[n]

;void

add(

int p,

int q)

queue<

int>qu;

vector<

int>ve;

int s[n]

;//入度

void

bfs()}

}int

main()

for(

int i=

1;i<=n;i++

)bfs()

;if(ve.

size()

!=n)

for(

int i=

0;isize()

;i++

) cout<<<

" ";

cout

}

拓撲排序學習筆記

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...

拓撲排序 學習筆記

今天,我們來聊聊拓撲排序。拓撲排序,這個顧名思義似乎有點難。那就直接上定義吧 啥意思呢。比如這樣乙個dag 幾種可能的拓撲序是 也就是說,dag的拓撲序可能並不唯一。那麼,1 3 2 4 5 6 7是不是這張圖的拓撲序呢?答案是否定的,因為圖中存在 2 rightarrow 3 這條邊,那麼2必須出...