貓貓向前衝(拓撲排序)

2021-10-05 03:38:44 字數 1886 閱讀 3492

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

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

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

輸入格式:

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

輸出格式:

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

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

樣例輸入:

4 3

1 22 3

4 3

樣例輸出:

1 2 4 3

題目分析:

題目給出了勝負關係,要求給出乙個符合要求的排名,能夠想到根據勝負關係構造有向圖,求出拓撲序列即可。

拓撲排序:

給定乙個dag,如果從u到v有邊,則認為v依賴於u。如 果u到v有路徑(u可達v),則稱v間接依賴於u。

拓撲排序的目標是將所有節點排序,使得排在前面的節點不能依賴於排 在後面的節點。

具體實現:

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

每次從q裡面取出乙個頂點u(可以隨便取)放入g, 然後遍歷頂點u的 所有邊(u, v), 並刪除之,並判斷如果該邊的另乙個頂點v,如果在移除這一條邊**度為0, 那麼就將這個頂點放入集合q中。不斷地重複取 出頂點然後重複這個過程

當集合q為空時,g中順序就是拓撲排序的結果

注意!!

題目中有字典序的要求:符合條件的排名可能不是唯一的,此時要求輸出時編號小的隊伍在前

所以我將q做了一點處理,由小到大排序

#include

#include

#include

#include

using

namespace std;

int n,m,p1,p2;

int indegree[

510]

;//記錄每個點的入度

vector<

int> p[

505]

;//記錄每個點可直接到達的點

intmain()

priority_queue<

int,vector<

int>

,greater<

int>

> q;

//小根堆,滿足字典序最小

for(

int i=

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

(indegree[i]==0

) q.

push

(i);

queue<

int> g;

while

(!q.

empty()

)}printf

("%d"

,g.front()

); g.

pop();

while

(!g.

empty()

)printf

("\n");

}return0;

}

拓撲排序 貓貓向前衝

眾所周知,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 的貓貓。給出乙個符合要求的字典序最小的排名。輸出時貓貓的編號之間有空格,最後一名後面沒有空格 樣例 ...