拓扑排序(Topological Sort):由某个集合上的一个偏序得到该集合上的一个全序。
偏序关系(Partial Order):若集合X上关系R是自反的、反对称的和传递的,则称R是集合X上的偏序关系。
全序是集合中全体成员之间均可比较。
解决拓扑排序:
(1)在有向图中选择一个没有前驱的顶点且输出之。
(2)从图中删除该顶点和所有以它为尾的弧。
重复上述两步,直至全部顶点均以输出,或者当前图中不存在无前驱的顶点为止。后一种情况则说明有向图中存在环。
计算机中解决:
Status TopologicalSort(ALGraph G){
//有向图G采用邻接表存储结构
//若G无回路,则输出G的顶点的一个拓扑序列并返回OK,否则ERROR。
FindInDegree(G,indegree); //对个顶点求入度indegree[0..vexnum-1]
InitStack(S);
for(i=0; i<G.vexnum; ++i) //建零入度顶点栈S
if(!indegree[i]) Push(S,i);//入度为0者进栈
count=0;
while(!StackEmpty(S)){
Pop(S,i); printf(i,G.vertices[i].data); ++count; //输出i号顶点并计数
for(p=G.vertices[i].firstarc;p;p=p->nextarc){
k=p->adjvex; //对i号顶点为每个邻接点的入度减1
if(!(--indegreee[k])) Push(S,k);//若入度减为0,则入栈
}//for
}//while
if(count<G.vexnum) return ERROR //该有向图有回路
else return OK;
}//TopologicalSort
分析算法,对有n个顶点和e条弧的有向图而言,建立求各顶点的入度时间复杂度为O(e);建零入度顶点栈的时间复杂度为O(n);在拓扑排序过程中,若有向图无环,则每个顶点进一次栈,出一次栈,入度减1的操作在While语句中总共执行e此,所以,总的时间复杂度为O(n+e)。
若已知无环,也可以深度优先搜索遍历。