HDU-1285試合順位決定(トポロジーソート)

2325 ワード

試合の順位を決める
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Problem Description
Nチーム(1<=N<=500)があり、番号は1、2、3、...Nは試合を行い、試合が終わった後、審判委員会はすべての参加チームを行った後から順番に順位をつけなければならないが、現在、審判委員会は直接各チームの試合成績を得ることができず、各試合の結果、すなわちP 1がP 2に勝ったことしか知らず、P 1,P 2で表され、順位はP 1がP 2の前にある.今、プログラムを作ってランキングを確定してください.
 
Input
入力にはいくつかのグループがあり、各グループの第1の動作の2つの数N(1<=N<=500)、M;ここで、Nは行列の個数を表し、MはM行に続く入力データを表す.次のM行データでは、行ごとに2つの整数P 1があり、P 2はP 1チームがP 2チームに勝ったことを示す.
 
Output
要件に合致するランキングを与えます.出力時にキュー番号の間にスペースがあり、最後の名前の後ろにスペースがありません.
その他の説明:条件に合致する順位は唯一ではない可能性があります.この場合、出力時の番号の小さいチームが上位にあることが要求されます.入力データは正しいことを保証します.すなわち、入力データは必ず要求に合致するランキングを確保します.
 
Sample Input
 
   
4 3 1 2 2 3 4 3
 

Sample Output
 
   
1 2 4 3

刚开始以为是同一层次的按照编号从小到大排名,结果样例都过不了,手动跑了一边,发现所有在队列中(即入度为0)的按照编号从小到大排名

感觉优先队列对int从小到大出队是保存在结构体内,并重载小于运算符,看来还是知道的太少了


#include 
#include 
#include 
#include 

using namespace std;

const int MAXN=505;
int n,m,cnt[MAXN],u;
vector > v;
vector t;

int topo() {
    int i,j,num=0;
    priority_queue,greater > q;//     int      ,priority_queue             
    for(i=1;i<=n;++i)
        if(cnt[i]==0)
            q.push(i);
    while(!q.empty()) {
        u=q.top();
        q.pop();
        if(++num!=1)
            printf(" ");
        printf("%d",u);
        for(i=0,j=(t=v[u]).size();i