拓扑序列
如果存在环,则一定不存在拓扑序列,有向无环图一定存在拓扑序列,所以有向无环图被称为拓扑图
一个有向无环图一定至少存在一个入度为0的点
有向图中每个点的入度(有几条边指向它) 出度(它指出几条边)
用BFS实现
const int N = 1e5+10;
int head[N],e[2*N],ne[2*N],idx = 0;
int n,m;
//手写队列
int q[N];
//入度
int indegree[N];
void init()
{
memset(head,-1,sizeof(head));
idx = 0;
}
void add(int a,int b)
{
e[idx] = b;
ne[idx] = head[a];
head[a] = idx;
idx ++;
}
bool topsort()
{
int hh = 0, tt = -1;
//把所有入度为0的点入队
for(int i=1;i<=n;i++)
if(!indegree[i])
q[++ tt] = i;
while(hh <= tt)
{
int t = q[hh ++];
for(int i = head[t]; i != -1; i = ne[i])
{
int j = e[i];
indegree[j] -- ;
if(indegree[j] == 0) q[++ tt] = j;
}
}
return tt == n - 1;
}
int main()
{
cin>>n>>m;
init();
for(int i = 0;i < m; i ++)
{
int a,b;
cin>>a>>b;
add(a,b);
indegree[b] ++ ;
}
if(topsort())
{
for(int i = 0; i < n; i++) cout<<q[i]<<' ';
cout<<endl;
}
else puts("-1");
return 0;
}