您的位置:首页 > 其它

HDU 4857 逃生(拓扑排序)

2014-07-20 22:45 260 查看


HDU 4857 逃生

题目链接

题意:中文题

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

代码:

#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;

const int N = 30005;
int t, n, m, ans
, vis
, an;
vector<int> g
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: