其实所谓的拓扑排序,就是对有向图的指向顺序的一种排序。
好比我们打游戏,10级的时候我们只能做10级的任务,到了20级可能会再开启两个任务,以此类推。
其实就是对做执行任务顺序的一种约束。
下面的代码是伪代码,个人觉得没有必要去实现,我们只需要掌握思想,思想大于一切。
代码中的注释很清晰,给出了简单和进阶的两种实现方式,如有不懂请自行参考数据结构与算法分析C语言版
//伪代码,拓扑排序的简单实现
void TopSort(Graph G)
{
//计数器
int Counter;
//V:入度顶点,W:出度顶点
Vertex V, W;
//NumVertex:顶点数 , Counter其实时在遍历入度数
for(Counter = 0; Counter < NumVertex; Conter++)
{
//找到入度为0的顶点
V = FindNewVertexOfIndegreeZero();
//如果不存在入度为0的顶点,说明这是一个有圈图,将不进行排序
if(V == NotAVertex)
{
Error("Graph has a cycle");
break;
}
//对该顶点进行排序,并删除
TopNum[V] = Counter;
//对与之关联的结点的入度-1
for each W adjacent V
{
Indegree[W]--;;
}
}
}
//伪代码,拓扑排序的队列实现
void TopSort(Graph g)
{
//声明队列
Queue Q;
//计数器
int Counter = 0;
//V:入度顶点,W:出度顶点
Vertex V, W;
//创建队列
Q = CreateQueue(NumVertex);
MakeEmpty(Q);
//遍历所有结点
for each vertex V
{
//如果结点入度为0,入队
if(Indegree[V] == 0)
{
Enqueue(V, Q);
}
}
//如果队列不是空
while(!IsEmpty(Q))
{
//出队
V = Dequeue(Q);
//对该节点进行排序,并删除
TopNum[V] = ++Counter;
遍历与之关联的结点
for each W adjacent to V
{
//入度自减后如果等于0
if(--Indegree[W] == 0)
{
//入队
Enqueue(W, Q);
}
}
//释放队列
DisposeQueue(Q);
}
}