1. 拓扑排序思想
由一个AOV网得到一个有序序列的过程称为拓扑排序。得到拓扑排序的算法思想如下:
- 检索AOV网中入度为0的顶点
- 将该顶点以及以从顶点出发的弧从网中删除,并记录到序列中
- 重复1、2,直至AOV网中没有剩余的顶点
为方便检索顶点,可以借助一个集合(向量、栈或队列)来记录每次删除后产生的入度为0的顶点。
2. 拓扑排序实现
int Indegree(MatrixGraph *mg, int v)
{
int count = 0;
for(int i = 0;i < mg->vexNum;i++) {
if(mg->arcs[i][v] > 0)
count++;
}
return count;
}
int TopoLogicalSort(MatrixGraph *mg, char seq[])
{
int index = 0;
LinkQueue *lq = malloc(sizeof(LinkQueue));
LinkQueueInit(lq); // 链队记录待删顶点
int *added = malloc(sizeof(int) * mg->vexNum);
memset(added, 0, sizeof(int) * mg->vexNum);
for(int i = 0;i < mg->vexNum;i++) {
if(Indegree(mg, i) == 0) {
LinkQueueEnQueue(lq, i);
added[i] = 1;
}
}
while(LinkQueueEmpty(lq) < 0) {
int v = -1;
LinkQueueDeQueue(lq, &v);
seq[index++] = mg->vexs[v];
for(int i = 0;i < mg->vexNum;i++) { // 在网内删除v出发的所有弧
mg->arcs[v][i] = 0;
if(Indegree(mg, i) == 0 && added[i] == 0) {
LinkQueueEnQueue(lq, i);
added[i] = 1;
}
}
}
free(added);
free(lq);
return index < mg->vexNum ? -1 : 1;
}