NOIP2018 98天倒计时……刷点NOIP题吧_(:з」∠)_
这道题就是逆拓扑排序的裸题,所谓逆拓扑就是倒着拓扑,每次优先取较大的元素,这样就保证了小的元素尽量靠前
如果有环输出Impossible!
我没输出回车! 我没输出回车! 我是SB! 我是SB! 我是SB! ! !
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
const int N = 100005;
std::vector<int> G[N];
std::priority_queue<int> Q;
int dgr[N], ans[N], cnt;
int read() {
int x = 0; char c = getchar();
while (c < '0' || c > '9') c = getchar();
while (c >= '0' && c <= '9') {
x = (x << 3) + (x << 1) + (c ^ 48);
c = getchar();
}
return x;
}
int main() {
int T = read();
while (T--) {
int n = read(), m = read(); cnt = 0;
memset(dgr, 0, sizeof dgr);
for (int i = 1; i <= n; ++i) G[i].clear();
for (int i = 1; i <= m; ++i) {
int x = read(), y = read();
G[y].push_back(x), ++dgr[x];
}
for (int i = 1; i <= n; ++i)
if (dgr[i] == 0) Q.push(i);
while (!Q.empty()) {
int u = Q.top(); Q.pop();
int sz = G[u].size();
for (int i = 0; i < sz; ++i) {
int v = G[u][i];
if (--dgr[v] == 0) Q.push(v);
}
ans[++cnt] = u;
}
if (cnt < n) puts("Impossible!");
else {
for (int i = n; i >= 1; --i) printf("%d ", ans[i]);
puts("");
}
}
return 0;
}