HDU1285確定比賽名次(拓撲排序)

2021-07-16 05:29:52 字數 1164 閱讀 7031

description

有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

4 31 2

2 34 3

sample output

1 2 4 3

思路:解決的辦法其實很簡單 ò

1、在有向圖中選乙個沒有前驅的頂點且輸出之。 ò

2、從圖中刪除所有以它為尾的弧。 ò

ò3、重複上述兩步,直到全部頂點已經輸出,或

者是當前圖中不存在無前驅的頂點為止。後一

種情況則說明圖中有環存在。

**:#include#include#includeusing namespace std;

int map[510][510];//前驅數量

int indegree[510];

int queue[510];//儲存拓撲序列

void topo(int n)

a[51000];

int head[51000];

void topo(int n)

}int sign=1;

while(!q.empty())

}} }

printf("\n");

}int main()

{ int n,m,i,j,a,b;

while(scanf("%d%d",&n,&m)!=eof){

memset(indegree,0,sizeof(indegree));

memset(map,0,sizeof(map));

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進行比賽,比賽結束後,裁判委員會要將所有參賽隊伍從...