这道题要件反图,答案反着输出。。。逆拓扑排序。。
#include <iostream>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <bitset>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <climits>
#include <cstdlib>
#include <cmath>
#define maxn 30005
#define eps 1e-10
#define mod 1000000009
#define INF 99999999
#define lowbit(x) (x&(-x))
#define lson o<<1, L, mid
#define rson o<<1 | 1, mid+1, R
typedef long long LL;
using namespace std;
struct node
{
int x;
bool operator < (const node &a) const {
return a.x>x;
}
}now, tmp;
priority_queue<node> q;
int in[maxn];
vector<int> g[maxn];
vector<int> p;
int n, m;
void init(void)
{
int i;
p.clear();
memset(in, 0, sizeof in);
for(i = 0; i < maxn; i++)
g[i].clear();
}
void read(void)
{
int u, v;
scanf("%d%d", &n, &m);
while(m--) {
scanf("%d%d", &u, &v);
g[v].push_back(u);
in[u]++;
}
}
void work(void)
{
int d, x, i;
for(i = 1; i <= n; i++)
if(in[i] == 0)
tmp.x = i, q.push(tmp);
while(!q.empty()) {
now = q.top();
q.pop();
x = now.x;
p.push_back(x);
d = g[x].size();
for(i = 0; i < d; i++) {
in[g[x][i]]--;
if(in[g[x][i]] == 0)
tmp.x = g[x][i], q.push(tmp);
}
}
d = p.size();
printf("%d", p[d-1]);
for(i = d-2; i >= 0; i--)
printf(" %d", p[i]);
printf("\n");
}
int main(void)
{
int _;
while(scanf("%d", &_)!=EOF) {
while(_--) {
init();
read();
work();
}
}
return 0;
}