Description:
給出一些關係,形如 表示i需要在j前面,求出滿足小的元素儘量在前面的序列。
Solution:
倒着拓撲排序。考慮正確性,當前有 兩個元素,且 ,把j放在 後面肯定更劣,所以先放 是正確的。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
int n, m;
int ans[maxn], in[maxn];
vector<int> G[maxn];
int main() {
int T;
scanf("%d", &T);
while(T--) {
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i) {
G[i].clear();
}
memset(in, 0, sizeof(in));
while(m--) {
int u, v;
scanf("%d%d", &u, &v);
G[v].push_back(u);
++in[u];
}
priority_queue<int> q;
for(int i = 1; i <= n; ++i) {
if(!in[i]) {
q.push(i);
}
}
ans[0] = 0;
while(!q.empty()) {
int u = q.top();
q.pop();
ans[++ans[0]] = u;
for(int i = 0; i < G[u].size(); ++i) {
int v = G[u][i];
if(!--in[v]) {
q.push(v);
}
}
}
if(ans[0] != n) {
puts("Impossible!");
} else {
for(int i = n; i; --i) {
printf("%d ", ans[i]);
}
puts("");
}
}
return 0;
}