队列拓扑
这里涉及到优先级的问题,采用优先队列从大到小排列,然后反向输出 就可以解决这个问题
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cmath>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <ctype.h>
#include <vector>
#include <algorithm>
#include <sstream>
#define PI acos(-1.0)
#define in freopen("in.txt", "r", stdin)
#define out freopen("out.txt", "w", stdout)
using namespace std;
typedef long long ll;
const int maxn = 200000 + 7, INF = 0x3f3f3f3f;
int n, m, u, v;
int vis[maxn];
vector<int> vec[maxn], a;
priority_queue<int, vector<int>, less<int> > qu;
void topo() {
while(!qu.empty()) {
int t = qu.top(); qu.pop(); a.push_back(t);
for(int i = 0; i < vec[t].size(); ++i) {
int x = vec[t][i];
vis[x]--;
if(!vis[x]) qu.push(x);
}
}
}
int main() {
scanf("%d %d", &n, &m);
for(int i = 0; i < m; ++i) {
scanf("%d %d", &u, &v);
vec[v].push_back(u);
vis[u]++;
}
for(int i = 1; i <= n; ++i)
if(!vis[i]) qu.push(i);
topo();
int i = a.size()-1;
printf("%d", a[i]);--i;
for( ; i >= 0; --i)
printf(" %d", a[i]);
puts("");
return 0;
}