HDU 4857 逃生(拓扑排序)

来源:互联网 发布:java程序员如何赚外快 编辑:程序博客网 时间:2024/05/16 04:45

HDU 4857 逃生

题目链接

题意:中文题

思路:逆拓扑排序,利用优先队列,每次先取度数0,标号最大的,进行拓扑排序,最后再反向输出

代码:

#include <cstdio>#include <cstring>#include <vector>#include <queue>using namespace std;const int N = 30005;int t, n, m, ans[N], vis[N], an;vector<int> g[N];int i;void solve() {priority_queue<int> Q;for (int i = 1; i <= n; i++)if (!vis[i]) Q.push(i);while (!Q.empty()) {int now = Q.top();Q.pop();for (int i = 0; i < g[now].size(); i++) {vis[g[now][i]]--;if (vis[g[now][i]] == 0) Q.push(g[now][i]);}ans[an++] = now;}}int main() {    scanf("%d", &t);    while (t--) {        an = 0;        memset(vis, 0, sizeof(vis));        scanf("%d%d", &n, &m);        for (i = 1; i <= n; i++)            g[i].clear();        int u, v;        while (m--) {            scanf("%d%d", &u, &v);g[v].push_back(u);vis[u]++;        }solve();for (int i = an - 1; i > 0; i--) printf("%d ", ans[i]);printf("%d\n", ans[0]);    }    return 0;}


0 0
原创粉丝点击