hdu 1285 确定比赛名次(拓扑排序)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1285

题意

有 $n$ 个比赛队($1 \le n \le 500$),编号依次为 $1,2,3,\dots,n$ 进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即 $P_1$ 赢 $P_2$,用 $P_1\ P_2$ 表示,排名时 $P_1$ 在 $P_2$ 之前。输出所有可能排名中字典序最小者。

题解

相似题目:Uva 10305

因为要按最小字典序输出,将队列改为小顶堆优先队列即可。

代码

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n, m;
    while (cin >> n >> m) {
        vector<int> G[n];
        int deg[n] = {};
        for (int i = 0; i < m; ++i) {
            int u, v; cin >> u >> v;
            --u, --v;
            G[u].push_back(v);
            ++deg[v];
        }
        priority_queue<int, vector<int>, greater<int>> que;
        for (int i = 0; i < n; ++i) {
            if (deg[i] == 0) {
                que.push(i);
            }
        }
        vector<int> res;
        while (!que.empty()) {
            int u = que.top();
            que.pop();
            res.push_back(u);
            for (auto v : G[u]) {
                if (--deg[v] == 0) {
                    que.push(v);
                }
            }
        }
        for (int i = 0; i < n; ++i) {
            cout << res[i] + 1 << " \n"[i == n - 1];
        }
    }
}

 

posted @ 2020-07-23 20:30  Kanoon  阅读(109)  评论(0)    收藏  举报