hdu 3342,1285
1285題目
有n個比賽隊(1<=n<=500),編號依次為1,2,3,。。。。,n進行比賽,比賽結束後,裁判委員會要將所有參賽隊伍從前往後依次排名,但現在裁判委員會不能直接獲得每個隊的比賽成績,只知道每場比賽的結果,即p1贏p2,用p1,p2表示,排名時p1在p2之前。現在請你程式設計序確定排名。
input
輸入有若干組,每組中的第一行為二個數n(1<=n<=500),m;其中n表示隊伍的個數,m表示接著有m行的輸入資料。接下來的m行資料中,每行也有兩個整數p1,p2表示即p1隊贏了p2隊。
output
給出乙個符合要求的排名。輸出時隊伍號之間有空格,最後一名後面沒有空格。
其他說明:符合條件的排名可能不是唯一的,此時要求輸出時編號小的隊伍在前;輸入資料保證是正確的,即輸入資料確保一定能有乙個符合要求的排名。
sample input
431
2234
3
sample output
124
3
拓撲排序思想:把所有度為0的節點加入佇列,從任意度為0的節點開始(看題目要求)把他從圖中去掉,然後將與其相鄰的節點的入度減少一,如果有乙個節點度為0,則繼續加入佇列,在迴圈結束後,如果拓撲排序的數字個數等於n,則表示為有向無環圖,否則,不是有向無環圖。然後這道題目中最為關鍵的是需要乙個拓撲序列的最小值,即每次都需要從佇列中取出度為0的最小數,因此可以使用優先佇列,過載最小值即可。
前期準備
1、vector實現鄰間表
vector<
int> graph[maxn]
;int indegree[maxn]
;while
(m--
)
2、拓撲排序
void
topologicalsort
(int n)
}}
完整**
#include
#include
#include
#include
#include
#include
using
namespace std;
const
int maxn=
501;
vector<
int> graph[maxn]
;int indegree[maxn]
;void
topologicalsort
(int n)}}
intmain()
topologicalsort
(n);
cout<}return0;
}
最後,,這題hdu上判斷有點問題,一開始總是提示我格式錯誤,後來發現是因為使用最小值的優先佇列是需要標頭檔案
#include functional ,具體原因我也不懂~~~~~~
這裡的拓撲排序也可以用vector陣列返回序列,我圖方便就直接輸出的,,按理來說vector陣列實現會更好
拓撲排序 確定比賽名次
題目 description 有n個比賽隊 1 n 500 編號依次為1,2,3,n進行比賽,比賽結束後,裁判委員會要將所有參賽隊伍從前往後依次排名,但現在裁判委員會不能直接獲得每個隊的比賽成績,只知道每場比賽的結果,即p1贏p2,用p1,p2表示,排名時p1在p2之前。現在請你程式設計序確定排名。...
確定比賽名次 (拓撲排序)
有n個比賽隊 1 n 500 編號依次為1,2,3,n進行比賽,比賽結束後,裁判委員會要將所有參賽隊伍從前往後依次排名,但現在裁判委員會不能直接獲得每個隊的比賽成績,只知道每場比賽的結果,即p1贏p2,用p1,p2表示,排名時p1在p2之前。現在請你程式設計序確定排名。input 輸入有若干組,每組...
確定比賽名次 (拓撲排序)
有n個比賽隊 1 n 500 編號依次為1,2,3,n進行比賽,比賽結束後,裁判委員會要將所有參賽隊伍從前往後依次排名,但現在裁判委員會不能直接獲得每個隊的比賽成績,只知道每場比賽的結果,即p1贏p2,用p1,p2表示,排名時p1在p2之前。現在請你程式設計序確定排名。input 輸入有若干組,每組...