拓撲排序 貓貓向前衝

2021-10-05 01:45:30 字數 1843 閱讀 7034

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

我們需要知道貓貓們的排名,首先我們可以確定一件事,若是貓貓a勝過了貓貓b,那麼貓貓a的排名一定比貓貓b高。因此我們可以從這裡入手。採用拓撲排序的思想,採用kahn演算法。

首先我們按照貓貓之間的勝負關係建立有向邊,若a勝過b,則在建立一條由a指向b的有向邊,並且b的入讀加1 。當我們建好圖後我們可以知道第一名一定是在那些那些入讀為0的貓貓中並且是他們中字典序最小的貓貓。所以我們採用小根堆記錄所有入度為0的貓,然後依次彈出,注意彈出的時候即從圖中刪除這個點,所以要把所有從這個點伸出去的邊刪除,所以這些邊指向的那個點入讀就會減一,若是減完**讀為0,我們則將他們加入小根堆中,一直進行指導小根堆為空。若是此時圖裡面還有點,那麼必定會存在環,錯誤。

我們按照a是b的前序節點的關係進行排序時可以採用拓撲排序的思想,kahn演算法可以幫助我們解決。

#define _crt_secure_no_deprecate 

#include

#include

#include

#include

//#include

using

namespace std;

struct edge

;priority_queue<

int,vector<

int>

,greater<

int>

>q;

//小根堆

edge edge[

60000];

int head[

505]

;int beforenumber[

505]

;bool out[

505]

;int tot;

int n, m;

void

add(

int u,

int v)

void

clear()

void

kahn()

}printf

("%d"

, u);if

(--n !=0)

printf

(" ");

}}intmain()

for(

int i =

1; i <= n; i++

)kahn()

;printf

("\n");

}}

貓貓向前衝 拓撲排序

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

貓貓向前衝(拓撲排序)

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

B 貓貓向前衝(拓撲排序

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