《學習筆記》 拓撲排序

2022-08-13 22:42:10 字數 945 閱讀 1428

條件:有向無環圖。

1.找出入度為0的點

2.刪除這個點和這個點連出的所有邊。

3.若已經沒有入度為0的點,排序結束。

迴圈結束後,若輸出的頂點數小於圖中的頂點數,就說明存在著環。

由於拓撲排序可以保證一條邊的起點一定比他的終點早出現,所以可以用於解決一些奇奇怪怪的問題和對一些演算法進行優化(如差分、字首處理)。

我們求拓撲排序通常會用到佇列。

每次彈出對頭元素,並把它的出邊所連向的點入度--,如果入度為0,就壓入佇列,正確性顯然。

例題 洛谷 3183 haoi2016 食物鏈

**

1 #include2 #include3 #include4 #include5 #include6 #include7

using

namespace

std;89

int n,m,a,b,cnt,ans=0;10

int first[100010],next[200010],rd[100010],ans[100010

];11

];12

13struct

maplerode[200010

];16

17void build(int f,int

t)18

;20 next[cnt]=first[f];

21 first[f]=cnt;22}

2324 queueq;

25int

main()

2634

for(int i=1;i<=n;++i)

3536

40while(!q.empty())

4152

if(!f) ans+=ans[a];53}

54 printf("%d"

,ans);

55return0;

56 }

拓撲排序學習筆記

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