拓撲排序解成績排名問題

2022-09-23 23:27:11 字數 1942 閱讀 5515

描述

2013「華為杯」南京郵電大學大學生團體歌唱大賽比賽形式為:大賽分為多輪,每一輪隨機選擇參賽團體進行兩兩pk賽。當根據多輪多場的pk賽成績能夠確定排名次序時,大賽結束。

我們將問題進行簡化,從1開始按遞增順序給每乙個參賽團體分配乙個整數編號,每個參賽團體在比賽期間表現出的歌唱水平各不相同且穩定不變,每場pk賽成績必定勝負。給定已記錄的多場pk賽成績,請你根據勝負關係確定大賽是否應該結束,並且能夠排除記錄出現錯誤的情形。

舉乙個例子,共有三個參賽團體參加大賽,如果參賽團體1在pk賽中勝參賽團體3、參賽團體2在pk賽中勝參賽團體1,則可知參賽團體2的成績比參賽團體3的成績排名高,也說明參賽團體2的歌唱水平一定高於參賽團體3的歌唱水平;如果參賽團體1在pk賽中勝參賽團體2、參賽團體2在pk賽中勝參賽團體3、參賽團體3在pk賽中勝參賽團體1,則出現這種情形說明存在明顯的記錄錯誤。

輸入輸入包括多個測試用例。

每個測試用例包括c+1行,第1行給出參賽團體總數m、已知pk賽成績的場次數c;接下來有c行,每一行先後給出兩個參賽團體編號p和q,表示編號為p的參賽團體在pk賽中勝編號為q的參賽團體;這裡1≤m≤1000,1≤c≤500000,1≤p≤m,1≤q≤m,p≠q。

最後一行為「0 0」,表示輸入結束,這一行無需處理。

輸出針對問題輸入中的每個測試用例,輸出一行字串,具體規定如下:

l 根據已記錄的pk賽成績能夠確定排名次序時,則輸出字串competition over

l 根據已記錄的pk賽成績還不能確定排名次序時,則輸出字串competition continue

l 根據已記錄的pk賽成績不可能確定排名次序時,則輸出字串wrong results

樣例輸入

4 34 3

3 22 1

4 34 3

2 31 4

4 34 3

1 43 1

0 0樣例輸出

competition over

competition continue

wrong results

本題我的最初想法是這樣的: 利用二維陣列mark 儲存點之間的相連關係. 若mark[i][j] =1,則表明 i到j之間有一條通路,即i>j .

在沒加入一條邊s-t時,更新mark, 使能到達s的點也能到達t

每連線兩個本未相連的點時tot++, tot儲存連線數.

判斷時,首先檢查是否存在點對 i ,j 使mark[i][j]==mark[j][i]==1 ,若存在,則出現矛盾情況 wrong result

如果不滿足上述條件, 則檢查tot. 若tot不等於m*(m-1)/2 則連線不足, 必須繼續比賽.

不滿足上述兩種情況, 則比賽結束.

雖然思路很順,做法貌似可行,樣例輸出也對,可是啊,提交時一直是超時啊,怎麼交都是超時啊,已經各種優化各種剪枝了啊. 就在崩潰之時,在乙個類似題目的回帖中看到四個大字"拓撲排序" ! 林光一閃有木有, 醍醐灌頂有木有,之前的作法弱爆了有木有!

如果出現死迴圈則 wrong results, 出現多於乙個入度為0的點則 competition continue(因為同時度為0的點之間無法決勝), 這道題簡直為拓撲為生啊.我感覺我也要為拓撲為生啊有沒有啊.

要注意的是這道題矛盾情況是要壓倒平局情況的.也就是根據題目描述,如果同時出現比分矛盾和平局,那麼結果應該為矛盾,此時已經沒有必要再continue了!

所以發現平局時設定flag為1,但並不退出迴圈. 如果後面發現矛盾是要flag=2來覆蓋掉的.

帶馬!#include

#include

using namespace std;

class node

;int ls[1001],lt[1001],mark[1001];

int main()

flag=0;

while(tot1)

if(sum==0)

mark[location]=1;

for(j=0;j

問題1448 成績排名

成績排名 描述已有a b兩個鍊錶,每個鍊錶中的結點包括學好 成績。要求把兩個鍊錶合併,按學號公升序排列。輸入第一行,a b兩個鍊錶元素的數量n m,用空格隔開。接下來n行是a的資料 然後m行是b的資料 每行資料由學號和成績兩部分組成 輸出按照學號公升序排列的資料 輸入樣例 1 2 3 5 100 6...

學生成績排名(並列問題)

成績排名 輸入多個學生的姓名和成績,列印其名稱.成績和排名 輸入 第一行 整數n 表示有n個學生 第二行開始,每行乙個字串和乙個整數,表示學生姓名和成績 輸出 按成績從高到低的順序列印每個學生的姓名,成績,排名 需要注意的是,如果成績相同,則排名並列 include include include ...

學生成績排名

表結構t2 sid fs 1 200 2 200 3 190 4 190 5 180 sid為學號,fs為學生總分 要求結果為 sid fs paiming 1 200 1 2 200 1 3 190 2 4 190 2 5 180 3 測試資料 create table t2 sid int nu...