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]; } } }

浙公网安备 33010602011771号