算法思想
按照有向图给出的次序关系,将图中顶点排成一个线性序列,对于有向图中没有限定次序关系的顶点,则可以人为加上任意的次序关系,由此所得顶点的线性序列称之为拓扑有序序列。显然对于有回路的有向图得不到拓扑有序序列,因为有回路的话,顶点的先后次序就不确定了。
例如,下图,我们可以人为限定次序:A B C D 或 A C B D
如何进行拓扑排序?
- 从有向图中选取一个没有前驱(没有在它之前活动)的顶点,输出之;
- 从有向图中删去此顶点以及所有以它为尾的弧;
- 重复上述两步,直至图空,或者图不空但找不到无前驱的顶点为止。
没有被打印输出的顶点构成回路了。
例如,A C B H G D F E(不唯一)。可以发现图中所有顶点都被打印输出了,证实了这个有向图中不存在回路。
拓扑排序的第一步,首先找到没有前驱的顶点,那么没有前驱的顶点,它的特征是什么呢?我们在算法里,如何去找没有前驱的顶点呢?
没有前驱的顶点==入度为零的顶点
删掉这个顶点以及它所对应的出度的弧,又该如何实现呢?
删除顶点及它的出弧==弧头顶点的入度-1
拓扑排序实现
获取各顶点入度的函数:
void FindID(AdjList G, int indegreeIMAX_VERTEX_NUM]){
int i;
ArcNode *p;
for(i=0;i