所谓拓扑排序也就是有向无环图,它可以检验一个有向图中是否存在回路,具体的操作方法就是
(1)在有向图中选一个没有前驱的顶点并且输出
(2)从图中删除该顶点和所有以它为尾的弧,即删除所有与它有关的边。
(3)重复上述两步,直至全部顶点均已输出;或者当图中不存在无前驱的顶点为止。
借用博主的图片理解拓扑排序https://blog.csdn.net/qq_40693171/article/details/100536278?
- 1:删除1或2输出
- 2:删除2或3以及对应边
- 3:删除3或者4以及对应
- 4:重复以上规则步骤
- 具体代码如下
void topo()
{
queue<int> q;
for(int i=1;i<=vertexnum;i++)
{
if(indegree[i]==0)
{
q.push(i);
}
}
while(!q.empty())
{
int temp=q.front();
cout<<vertex[temp]<<" ";
cnt++;
q.pop();
for(int i=1;i<=vertexnum;i++)
{
if(edge[temp][i]!=0)
{
indegree[i]--;
if(indegree[i]==0)
q.push(i);
}
}
}
if(cnt<vertexnum)
cout<<"有回路"<<endl;
}