拓扑排序
定义:由某个几何上的一个偏序得到这个集合上的全序,这个操作称为拓扑排序。
偏序->全序:增加了原来偏序中没有的优先关系(保留了原来的偏序关系,对于新增加的优先关系,没有先后顺序要求)。
没有前驱的元素,说明没有先决条件;
(多个没有前驱的元素谁在前都行,怎么排都不影响原来的偏序关系)
拓扑排序的步骤:
1. 在有向图中选一个没有前驱的元素,放入集合S中;
2. 从S中取出元素Vi,删除Vi对其他优先元素的影响。
3. 重复上面两个步骤,直至全部定点均以输出。(如果顶点并没有全部输出,但却不存在无前驱的顶点,说明有向图中存在环)
没有前驱的元素也就是入度为0的元素
初始化元素的入度值,初始化集合S
While(S不为空)
任取一元素Vi,对所有Vi->Vj 对Vj的入度值-1
If入度Vj=0 则加入S
用邻接表表示
0 V1 3 1 2
1 V2
2 V3 4 1
3 V4 4
4 V5
5 V6 3 4
算法实现
1.计算入度值
for(v=0;v<G.vexnum;++v){
p=G.vertices[v].firstarc;
while(p){
indegree(p->adjvex)+=1;
p=p->nextarc;
}
}
2.拓扑排序算法
status TopologicalSort(ALGraph){
findingree(G,indegree);
initstack(S);
for(v=0;v<G.vexnum;v++){
if(!indegree[v])
push(S,v);//入度为零的元素进栈
count=0;//对输入的顶点计数
while(!stackEmpty(S)){//当S不为空时 任意取出一个元素
pop(S,v);
cout<<G.vertices[v].data;
count=count+1;//每输出一个顶点,计数器加一
for(p=G.vertices[i].firstarc;p;p=p->nextarc){
x=p->adjvex;
indegree[x]-=1;//对每个邻接点的入度减一
if(indegree[x]==0)//如果入度减为一的话,则加入S中
push(S,x);
}
}
}
}