SDU程式設計思維Week8 作業 B 貓貓向前衝

2021-10-23 06:29:16 字數 1522 閱讀 5274

有 n 只貓貓,編號依次為1,2,3,…,n進行比賽。比賽結束後,up 主會為所有的貓貓從前到後依次排名並發放愛吃的小魚幹。不幸的是看不到最後的頒獎典禮。

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

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

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

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

input:43

1223

43output:12

43

題意:勝負關係代表一條邊,p1贏p2即p1—>p2,要求p1的名次在p2前面

這道題的基本方法是前向星+kahn演算法(bfs)拓撲排序

拓撲排序的結果存在多解,題意要求輸出字典序最小的序列,使用優先順序佇列替代佇列即可

乙個點進入優先順序佇列的條件是入度為0

wa和t了好幾次,應該還是前向星遍歷邊的終止條件的問題。

時間複雜度為o(n+m)

#include

#include

#include

#include

#include

using

namespace std;

struct edge e[

150020];

int n, m;

int tot =

0,head[

520]

,in_deg[

520]

;//前向星

void

add(

int u,

int v)

void

init()

}int

main()

priority_queue<

int> q;

for(

int i =

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

(in_deg[i]==0

)q.push

(-i)

; vector<

int> ans;

while

(!q.

empty()

)}printf

("%d"

, ans[0]

);for(

int i =

1; i < ans.

size()

; i++

)printf

(" %d"

, ans[i]);

printf

("\n");

}}

SDU程式設計思維Week8 作業 C 班長競選

大學班級選班長,n 個同學均可以發表意見 若意見為 a b 則表示 a 認為 b 合適,意見具有傳遞性,即 a 認為 b 合適,b 認為 c 合適,則 a 也認為 c 合適。勤勞的 tt 收集了m條意見,想要知道最高票數,並給出乙份候選人名單,即所有得票最多的同學 本題有多組資料。第一行 t 表示資...

程式設計思維 week8 作業A 區間選點 II

給定乙個數軸上的 n 個區間,要求在數軸上選取最少的點使得第 i 個區間 ai,bi 裡至少有 ci 個點 使用差分約束系統的解法解決這道題 輸入第一行乙個整數 n 表示區間的個數,接下來的 n 行,每一行兩個用空格隔開的整數 a,b 表示區間的左右端點。1 n 50000,0 ai bi 5000...

程式設計思維 week8 作業C 班長競選

大學班級選班長,n 個同學均可以發表意見 若意見為 a b 則表示 a 認為 b 合適,意見具有傳遞性,即 a 認為 b 合適,b 認為 c 合適,則 a 也認為 c 合適 勤勞的 tt 收集了m條意見,想要知道最高票數,並給出乙份候選人名單,即所有得票最多的同學,你能幫幫他嗎?本題有多組資料。第一...