題意還是比較容易理解的,關鍵要看到後面的:合條件的排名可能不是唯一的,此時要求輸出時編號小的隊伍在前;
思路:這道題就是拓撲排序的經典應用了,用佇列做的考慮優先編號小的出隊就可以了。
拓撲排序:
拓撲排序是對有向無迴路圖(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進行比賽,比賽結束後,裁判委員會要將所有參賽隊伍從...