【Hdu1285]大会決定

OK大会


問題の説明
Nマッチチーム(1 <= N <= 500)、番号2、3、続いがあります。、Nゲームは、ゲーム後、審判委員会は、前方から順にランク付けすべてのチームがバックアップしたいが、審判は各チームのレース結果を直接利用できない、だけですべてのゲーム、その勝利のP1 P2の結果を知っている、とP2の前にP1をランク付けするとき、P1、P2、と彼は言いました。今、私たちは、ランキングを決定するようにプログラムしています。
 

入力
入力いくつかのグループであり、二つの第一の行番号N(1 <= N <= 500)、Mの各基であり; Nは、チームの数であり、その後、Mは、M行の入力データです。次のMラインのデータは、各ラインは、2つの整数P1を有し、P2、すなわちP1、P2チームは、チームを獲得表します。
 

出力
要件に沿ったランキングを考えます。チーム番号の出力の間にスペースがありますが、最後の1の後にスペースがありません。

その他の注意事項:適格ランキングは、出力の小さな数が第一位と、その必要とする、ユニークではないかもしれない、入力データが正しいことが保証されている、つまり、入力されたデータは、満足のいく順位があることを確認することができなければなりません。
 

サンプル入力
  
  
4 3 1 2 2 3 4 3


#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int N = 505;
int n, m, t;
int map[N][N], indegree[N];
priority_queue<int, vector<int>, greater<int> > q;

void topsort()
{
    while (!q.empty()) q.pop();
    for (int i = 1; i <= n; ++i)
        if (indegree[i] == 0)
            q.push(i);
    int cnt = 1;
    while (!q.empty()) {
        t = q.top();
        q.pop();
        if (cnt != n) {
            printf("%d ", t);
            cnt++;
        }
        else printf("%d", t);
        for (int i = 1; i <= n; ++i) {
            if (map[t][i]) {
                indegree[i]--;
                if(indegree[i] == 0)
                    q.push(i);
            }
        }
    }
}

int main()
{
    int x, y;
    while (~scanf("%d%d", &n, &m)) {
        memset(map, 0, sizeof(map));
        memset(indegree, 0, sizeof(indegree));
        for (int i = 0; i < m; ++i) {
            scanf("%d%d", &x, &y);
            if(!map[x][y]) {
                map[x][y] = 1;
                indegree[y]++;
            }
        }
        topsort();
        puts("");
    }
    return 0;
}

おすすめ

転載: www.cnblogs.com/2inf/p/11299591.html