拓扑排序是一种无环的有向图的排序,了解拓扑排序之前,我们先了解一下什么是AOV图

AOV网不能有回路,不然就不能确定先后次序了
拓扑排序的目标就是把有向无环图中的所有结点排序,使得排在前面的结点不会依赖后面的结点
流程如下:step1:找到所有入度为0的点,加入到队列中
step2:依次删除队列里的队头结点,每次删除的时候把连着该结点的边也删掉,并且把新的入度为0的点加入进来
step3:直到队列中没有结点了,此时排序结束
如果队列里有环,是不能把所有结点都排上序的,所以拓扑排序还可以判断图里有没有环
具体流程





好的,我们来做一下模板题

cpp
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int N = 110;
int in[N];
int n;
vector<int> edges[N];
int main()
{
cin >> n;
for(int i = 1;i<=n;i++)
{
int x;
while(cin>>x,x)
{
edges[i].push_back(x);
in[x]++;
}
}
queue<int> q;
for(int i = 1;i<=n;i++)
{
if(in[i]==0) q.push(i);
}
while(q.size())
{
auto t = q.front();q.pop();
cout << t << " ";
for(auto &e : edges[t])
{
in[e]--;
if(in[e]==0)
{
q.push(e);
}
}
}
return 0;
}