Kahn拓扑排序模板
O(V+E)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int maxn=1e5+5;
int n,m;
vector<int >edge[maxn],ans;
queue<int> q;
int in[maxn];
void kahn()
{
for(int i=1;i<=n;i++)
{
if(!in[i])
q.push(i);
}
while(q.size())
{
int now=q.front();q.pop();
ans.push_back(now);
for(int i=0;i<edge[now].size();i++)
{
int p=edge[now][i];
in[p]--;
if(!in[p])
q.push(p);
}
}
}
int main()
{
cin>>n>>m;
while(m--)
{
int u,v;
cin>>u>>v;
in[v]++;
edge[u].push_back(v);
}
kahn();
for(int i=0;i<ans.size();i++)
cout<<ans[i]<<" ";
return 0;
}