一、題目描述
眾所周知, 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 input4 31 2
2 34 3
sample output二、思路概述1 2 4 3
1.使用拓撲排序的方法,可以很快解決這個問題。
2.先構成圖,若編號為 p1 的貓貓贏了編號為 p2 的貓貓,則p1到p2有一條邊,並計算每個點的入度。
3.先將入度為0的點進入優先佇列xp,出隊乙個點(放入乙個新的佇列sp),就將它鄰接的點的入度減一,並檢測是否有哪個點的入度為0,若為0,則入優先佇列,再出隊,重複上述過程,直到xp為空。
4.sp佇列中存放著最後的名次,按順序輸出即可。
三、細節
1.優先佇列預設是從大到小排序,為了適用本題需要從小到大排序,可以入隊的時候,使進入佇列的是負值,這樣就可以使用了。
2.前向星的使用不夠熟練,遍歷鄰接點時造成錯誤。
3.選擇性眼瞎,沒有看見是多組資料。。。。
四、完整**
#include
#include
using
namespace std;
const
int maxn=
5e4+10;
//鏈式前向星
struct edgee[maxn]
;int n,num;
//n表示貓貓的個數
int head[maxn]
,degree[maxn]
;//dis[i]表示數軸上0,i之間選點的個數
priority_queue<
int> xp;
//優先佇列,從大到小排序
queue<
int> sp;
void
init()
}void
addedge
(int from,
int to)
void
toposort()
}while
(!xp.
empty()
)}int ans;
while
(sp.
size()
!=1) cout
; sp.
pop();
}int
main()
toposort()
; cout<}}
week8 B 貓貓向前衝(拓撲排序)
眾所周知,tt 是一位重度愛貓人士,他有乙隻神奇的魔法貓。有一天,tt 在 b 站上 貓貓的比賽。一共有 n 只貓貓,編號依次為1,2,3,n進行比賽。比賽結束後,up 主會為所有的貓貓從前到後依次排名並發放愛吃的小魚幹。不幸的是,此時 tt 的電子裝置遭到了宇宙射線的降智打擊,一下子都連不上網了,...
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 的電子裝置遭到了宇宙射線的降智打擊,一下子都連不上網了,...