SDU week8 B 貓貓向前衝(拓撲排序)

2021-10-04 22:47:16 字數 1909 閱讀 1273

眾所周知, 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

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

其他說明:符合條件的排名可能不是唯一的,此時要求輸出時編號小的隊伍在前;輸入資料保證是正確的,即輸入資料確保一定能有乙個符合要求的排名。

sample input

4 31 2

2 34 3

sample output

1 2 4 3

這是一道拓撲排序模板題。使用kahn演算法即可。方法是存圖的同時使用indeg陣列記錄每個點入度數,入度為0的點是最厲害的,因為沒有點指向它,首先遍歷indeg將他們取出壓入小根堆。然後依次從堆頂讀取點並將其壓入輸出向量ans,同時遍歷其指向的點,將其入度-1,一旦有乙個點入度為0,立即將其壓入小根堆。迴圈的終止條件是堆空。為保證是字典序最小的名次序列,我們使用小根堆存待排序點。

本題需注意的是:

有多組輸入。一開始沒有好好讀題wa了。

鄰接矩陣存圖會tle,長長記性,盡量少用。

因為priority_queue預設是大根堆,宣告普通型別小根堆使用如下:

priority_queue< int, vector< int >, greater< int > > q;

但倘若需要使用結構體就在結構體內外定義比較函式即可。

#define _crt_secure_no_warnings

#define _ ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

#include

//#include

//#include

using

namespace std;

int n, m, a, b;

int indeg[

509]

;//入度

//bool cat[509][509];//存圖 鄰接矩陣存圖tle了。。。

vector<

int>g[

509]

;int

main()

priority_queue<

int, vector<

int>

, greater<

int>

> q;

//宣告小根堆

vector<

int> ans;

for(

int i =

1; i <= n; i++)if

(indeg[i]==0

)q.push

(i);

while

(!q.

empty()

)}for(

int i =

0; i < n; i++

) cout << endl;

}return0;

}

week8 B 貓貓向前衝

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

WEEK 8 B 貓貓向前衝

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

Week8 作業 B 貓貓向前衝

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