HDU 1285 確定比賽名次(拓撲排序模板)

2021-12-30 00:17:31 字數 1203 閱讀 5622

題意還是比較容易理解的,關鍵要看到後面的:合條件的排名可能不是唯一的,此時要求輸出時編號小的隊伍在前;

思路:這道題就是拓撲排序的經典應用了,用佇列做的考慮優先編號小的出隊就可以了。

拓撲排序:

拓撲排序是對有向無迴路圖(dag)頂點的一種排序,它使得如果存在從u到v的有向路徑,那麼滿足序列中u在v前。所以我們的演算法可以描述為這樣乙個過程:1、找到整個圖中所有的度為0的點,將這些點壓進佇列(棧)中

2、從佇列(棧)中取出一點,輸出,將該點及它的邊刪除,找到它所指向的點,如果改點是乙個原點(刪除指向它的點後),則壓入佇列(棧)

3、重複2過程,直到它為空

注:所謂度為0,即沒有子節點,為1則只有乙個,為2則有2個。為什麼要先讓度為0的點出來?因為你在定義的時候,度為0的點,則說明其沒有父節點,即沒有人排在它的前面!

所以基本ac**:#include

#include

using namespace std;

int map[502][502],flag[502],m,n,val[502];

void topsort()

if(j>n)

return ;

} }}int main()

} topsort();

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

if(i!=n)

cout<

優先佇列優化後的**:

#include

#include

#include

#include

#include

using namespace std;

const int n=510+10;

vector g[n]; //鄰接表

int du[n],val[n];

int n,m;

void topsort()

{ int i;

priority_queue, greater > q;//定義乙個優先佇列,並定義編號小的優先出隊

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

if(!du[i])

q.push(i);

int cnt=1;

while(!q.empty())

{int u=q.top();

q.pop();

val[cnt++]=u;

for(i=0;i

確定比賽名次 HDU 1285 ,拓撲

有n個比賽隊 1 n 500 編號依次為1,2,3,n進行比賽,比賽結束後,裁判委員會要將所有參賽隊伍從前往後依次排名,但現在裁判委員會不能直接獲得每個隊的比賽成績,只知道每場比賽的結果,即p1贏p2,用p1,p2表示,排名時p1在p2之前。現在請你程式設計序確定排名。input輸入有若干組,每組中...

HDU 1285 確定比賽名次 拓撲排序

problem description 有n個比賽隊 1 n 500 編號依次為1,2,3,n進行比賽,比賽結束後,裁判委員會要將所有參賽隊伍從前往後依次排名,但現在裁判委員會不能直接獲得每個隊的比賽成績,只知道每場比賽的結果,即p1贏p2,用p1,p2表示,排名時p1在p2之前。現在請你程式設計序...

拓撲排序 HDU 1285 確定比賽名次

g 確定比賽名次 time limit 1000msmemory limit 32768kb64bit io format i64d i64u submit status description 有n個比賽隊 1 n 500 編號依次為1,2,3,n進行比賽,比賽結束後,裁判委員會要將所有參賽隊伍從...