輸入有若干組,每組中的第一行為二個數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 的電子裝置遭到了宇宙射線的降智打擊,一下子都連不上網了,...