拓扑排序是指,每一个顶点都不会通过边,指向其在此序列中的前驱顶点,这样的线性序列,被称为拓扑排序(topological sorting)。
只有有向无环图中会存在拓扑排序,但数量不一定唯一。
拓扑排序的实现方法,找到入度为0的顶点之后从图中剔除,之后将此顶点依次排列,重复上述步骤直到排序完成。
实现
queue<int>q;
for(int i=0;i<n;i++) //n 节点的总数
if(in[i]==0) q.push(i); //将入度为0的点入队列
vector<int>ans; //ans 为拓扑序列
while(!q.empty())
{
int p=q.top(); q.pop(); // 选一个入度为0的点,出队列
ans.push_back(p);
for(int i=0;i<edge[p].size();i++) // 判断它连接的边
{
int y=edge[p][i];
in[y]--; // 如果剔除这个顶点的图中,如果有新的顶点的入度为0则加入队列
if(in[y]==0)
q.push(y);
}
}
if(ans.size()==n)
{
for(int i=0;i<ans.size();i++)
printf( "%d ",ans[i] );
printf("\n");
}
else printf("No Answer!\n"); // ans 中的长度与n不相等,就说明无拓扑序列