拓扑排序
什么是拓扑排序?
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。
简言之,就是事物按照某种特定的优先关系进行排序。
怎么实现拓扑排序?
- 在有向图中选一个没有前驱的顶点且输出之。
- 从图中删除该顶点和所有以他为尾的弧。
- 重复上述两步,直至全部顶点均以输出,或者当前图中不存在无前驱的顶点为止。后一种情况说明有向图中存在环。
代码实现
Status TopologicalSort(ALGraph G) {
//有向图G采用邻接表存储结构
FindINDegree(G, indegree);
//对各顶点求入度
InitStack(S);
for (i = 0; i < G.vexnum; ++i) {
if (!indegree[i]) {
push(S, i);
}
}//建栈暂存所有入度为零的点
count = 0;//输出点个数
while (!StackEmpty(S)) {
Pop(S, i);//栈顶入度为0的点出栈
printf(i, G.vertices[i].date);
++count;//输出i顶点并计数
for (p = G.vertices[i].firstarc; p; p = p->nextarc) {
k = p->adjvex;
if (!(--indegree[k])) {
Push(S, k);
}//对i顶点的每个邻接点的入度减一,若之后入度为0,则入栈
}
}
if (count < G.vexnum) {
return ERROR;
}//该有向图有回路
else return OK;
}