B 貓貓向前衝(拓撲排序

2021-10-05 00:02:13 字數 1246 閱讀 9100

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

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

樣例:輸入:

4 3

1 22 3

4 3

輸出:

1 2 4 3
分析題意,可知需要用拓撲排序來解題。即對輸出的每對貓,a,b,化作一條a到b的路線。通過乙個陣列rd 記錄下每個點的入度,在構建圖的時候記錄下,每個點的入度。在圖構建完成的時候,可以遍歷找出入度為0的點,因為需要字典序最小的排序,故將這些點放入優先佇列。每次從隊首取出乙個點的時候,將其放到佇列中。並以這個點開始,遍歷其所能到達的所有點,並將其能到達的所有的點的rd值減去1,減去的同時,判斷若入度已經為0,則將這些點也加入到優先佇列中去。最後等優先隊列為空的時候,則圖,遍歷完成。輸出佇列中的點即可。

#include 

#include

#include

#include

#include

#include

using namespace std;

queue q1;

priority_queue q2;

int n, m, p1, p2;

struct edge e[1000]

;int tot;

int head[505]

;int rd[505]

;// to到那個點 從那個點

void add_edge(int t, int f)

void bfs()}

}int main(

)for

(int i = 0; i < m; i++)

for(int i = 1; i <= n; i++)

bfs();

int x = q1.front(

); q1.pop();

cout << x;

while

(q1.size(

)) cout << endl;

}return 0;

}

B貓貓向前衝 拓撲排序

給出乙個有向無環圖,拓撲排序的目標是將所有節點排序,使得排在前面的節點不能依賴於排在後面的節點。kahn演算法 將入度為0的點組成乙個集合s 每次從s裡面取出乙個頂點u 可以隨便取 放入l,然後遍歷頂點u的 所有邊 u,v 並將所有的v入度 1 如果入度更新之後是0,那麼就將這個頂點放入集合s中。不...

拓撲排序(例B 貓貓向前衝

將入度為0的點組成一 個集合s 每次從s裡面取出乙個頂點u 可 以隨便取 放入l,然後遍歷頂點u的所有邊 u,v 並刪除之,並判斷如果該邊的另乙個頂點v,如果在移除這一條邊 度為0,那麼就將這個頂點放入集合s中。不斷地重複取出頂點然後重複這個過程 最後當集合為空後,就檢查圖中是否存在任何邊。如果有,...

拓撲排序 貓貓向前衝

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