B貓貓向前衝 拓撲排序

2021-10-05 03:01:04 字數 1915 閱讀 1806

給出乙個有向無環圖,拓撲排序的目標是將所有節點排序,使得排在前面的節點不能依賴於排在後面的節點。

kahn演算法

• 將入度為0的點組成乙個集合s

• 每次從s裡面取出乙個頂點u(可以隨便取)放入l, 然後遍歷頂點u的 所有邊(u, v), 並將所有的v入度-1;如果入度更新之後是0,那麼就將這個頂點放入集合s中。不斷地重複取 出頂點然後重複這個過程……

• 最後當集合為空後,就檢查圖中是否存在任何邊。如果有,那麼這個圖 一定有環路,否者返回l,l中順序就是拓撲排序的結果

下面是偽**(ma住)

這個演算法有點像bfs,不斷的取佇列元素然後遍歷。注意這裡的佇列也可以是優先順序佇列;如果要使輸出的拓撲排序序列符號序最小,那麼就需要使用優先順序佇列,如最小堆。

ps:最小堆的使用:

1、定義和宣告:(需要#include< queue >)

priority_queue,greater< int>> minh;

2、操作:

minh.empty();//是否為空

minh.top();//取最小的數

minh.pop();//刪除最小的數

眾所周知, tt 是一位重度愛貓人士,他有乙隻神奇的魔法貓。

有一天,tt 在 b 站上**貓貓的比賽。一共有 n 只貓貓,編號依次為1,2,3,…,n進行比賽。比賽結束後,up 主會為所有的貓貓從前到後依次排名並發放愛吃的小魚幹。不幸的是,此時 tt 的電子裝置遭到了宇宙射線的降智打擊,一下子都連不上網了,自然也看不到最後的頒獎典禮。

不幸中的萬幸,tt 的魔法貓將每場比賽的結果都記錄了下來,現在他想程式設計序確定字典序最小的名次序列,請你幫幫他。

input

輸入有若干組,每組中的第一行為二個數n(1<=n<=500),m;其中n表示貓貓的個數,m表示接著有m行的輸入資料。接下來的m行資料中,每行也有兩個整數p1,p2表示即編號為 p1 的貓貓贏了編號為 p2 的貓貓。

output

給出乙個符合要求的排名。輸出時貓貓的編號之間有空格,最後一名後面沒有空格!

這裡就是利用優先順序佇列進行拓撲排序即可;

然後最開始做題的時候,沒有發現這裡有多組資料,然後卡了好久~~

//字典序最小,那麼使用優先順序佇列heap(最小堆)

#include

#include

#include

#include

using

namespace std;

priority_queue<

int,vector<

int>

,greater<

int>> minh;

//最小堆

//前向星

int tot,n;

int head[

1005

],in_deg[

1005];

struct edgee[

10005];

void

add(

int x,

int y)

void

ini()}

void

toposort()

}//output

for(

int i=

0;i1;i++

)printf

("%d\n"

,ans[n-1]

);//最後乙個沒有空格

}int

main()

toposort()

;ini()

;}return0;

}

B 貓貓向前衝(拓撲排序

輸入有若干組,每組中的第一行為二個數n 1 n 500 m 其中n表示貓貓的個數,m表示接著有m行的輸入資料。接下來的m行資料中,每行也有兩個整數p1,p2表示即編號為 p1 的貓貓贏了編號為 p2 的貓貓。給出乙個符合要求的字典序最小的排名。輸出時貓貓的編號之間有空格,最後一名後面沒有空格 樣例 ...

拓撲排序(例B 貓貓向前衝

將入度為0的點組成一 個集合s 每次從s裡面取出乙個頂點u 可 以隨便取 放入l,然後遍歷頂點u的所有邊 u,v 並刪除之,並判斷如果該邊的另乙個頂點v,如果在移除這一條邊 度為0,那麼就將這個頂點放入集合s中。不斷地重複取出頂點然後重複這個過程 最後當集合為空後,就檢查圖中是否存在任何邊。如果有,...

拓撲排序 貓貓向前衝

眾所周知,tt 是一位重度愛貓人士,他有乙隻神奇的魔法貓。有一天,tt 在 b 站上 貓貓的比賽。一共有 n 只貓貓,編號依次為1,2,3,n進行比賽。比賽結束後,up 主會為所有的貓貓從前到後依次排名並發放愛吃的小魚幹。不幸的是,此時 tt 的電子裝置遭到了宇宙射線的降智打擊,一下子都連不上網了,...