在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。且该序列必须满足下面两个条件:
每个顶点出现且只出现一次。
若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。
有向无环图(DAG)才有拓扑排序,非DAG图没有拓扑排序一说。
这题需要用到模拟队列用p[N],tt,hh表示
首先将每个节点的度标记存储起来,然后先将度为0的节点存到队列里
然后队列里进行循环对每一个节点进行判断,对它的后继节点的度–,如果这个节点的度为0就把它加入队列中
最后得到的队列就是我们的结果(如果每个节点都被加入到了队列中)
/**
* ┏┓ ┏┓+ +
* ┏┛┻━━━┛┻┓ + +
* ┃ ┃
* ┃ ━ ┃ ++ + + +
* ████━████+
* ◥██◤ ◥██◤ +
* ┃ ┻ ┃
* ┃ ┃ + +
* ┗━┓ ┏━┛
* ┃ ┃ + + + +Code is far away from
* ┃ ┃ + bug with the animal protecting
* ┃ ┗━━━┓ 神兽保佑,代码无bug
* ┃ ┣┓
* ┃ ┏┛
* ┗┓┓┏━┳┓┏┛ + + + +
* ┃┫┫ ┃┫┫
* ┗┻┛ ┗┻┛+ + + +
*/
#include<cstdio>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <math.h>
#include<vector>
#include<queue>
#include<map>
#define ll long long
using namespace std;
const int N=1000000+100;
int n ,m;
ll s[N];
int h[N],e[N],ne[N],idx;
int d[N],q[N];
void add(int a,int b)
{
ne[idx]=h[a];
e[idx]=b;
h[a]=idx++;
}
int top()
{
int hh=0,tt=-1;
for(int i =1;i<=n;i++)
if(!d[i])q[++tt]=i;
while(hh<=tt)
{
int t =q[hh++];
for(int i =h[t];i!=-1;i=ne[i])
{
int j=e[i];
d[j]--;
if(!d[j])q[++tt]=j;
}
}
return tt==n-1;
}
int main()
{
cin>>n>>m;
memset(h,-1,sizeof h);
for(int i =1;i<=m;i++)
{
int a,b;
cin>>a>>b;
add(a,b);
d[b]++;
}
if(top())
{
for(int i =0;i<n;i++)
cout<<q[i]<<" ";
}
else
cout<<"-1";
return 0;
}