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

2021-08-07 07:52:46 字數 1785 閱讀 5471

有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 3

1 2

2 3

4 3

sample output

1 2 4 3

參看部落格: 寫的非常好

求拓撲排序的做法,就是用乙個in陣列記錄每個點的入度(就是能到達這個點的個數),找到入度為0的點,並把它能到達的點入度都減1,迴圈這個過程直到結束

鄰接矩陣的方法:

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int max_v = 510;

int e[max_v][max_v];

int n,m;

int indegree[max_v];

int ans[max_v];

void toposort()

}}int main(void)

}toposort();

for(int i=1;iprintf("%d ",ans[i]);

}printf("%d\n",ans[n]);

}return

0;}

當然如果點比較多,只能用鄰接表來存了,而且顯然每次尋找入度為0的最小序號可以用堆來優化

**如下:

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int max_v = 510;

int n,m;

vector

g[max_v];

bool book[max_v][max_v];

int indegree[max_v],ans[max_v];

priority_queue,greater > q;

void toposort()

int top = 0;

while(!q.empty())

}}int main(void)

}toposort();

for(int i=1;iprintf("%d ",ans[i]);

printf("%d\n",ans[n]);

}return

0;}

A 確定比賽名次(拓撲)

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

確定比賽名次 HDU 1285 ,拓撲

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

HDU 1258 拓撲排序Kahn演算法

問題概述 有n個比賽隊,編號為從1到n,比賽結束後,裁判委員會要將所有參賽隊伍從前往後依次排名,但現在 裁 判委員會不能直接獲得每個隊的比賽成績,只知道每場比賽的結果,即p1贏p2 用p1 p2表示 這種,排名時p1在 必 須在p2之前,現在請你程式設計序確定排名 答案不止一種,按照隊伍從小到大排列...