采用邻接表为图的存储结构。邻接表的定义见<图的生成算法>。
算法如下:
void topoSort(ALGraph *G) {
int i, v, indegree[G->vexnum];
ArcNode *p;
int stack[50], top = 0;
memset(indegree, 0, sizeof(indegree));
//find indegree
for (i = 0;i < G->vexnum;i++) {
for (p = G->vertices[i].firstarc;p;p = p->nextarc)
indegree[p->adjvex]++;
}
printf("\nTopological Sort:\n");
for (i = 0;i < G->vexnum;i++) {
//printf("%d ", indegree[i]);
if (indegree[i] == 0)
stack[top++] = i;
}
while (top > 0) {
v = stack[--top];
printf("V%d ", v + 1); //输出顶点
for (p = G->vertices[v].firstarc;p;p = p->nextarc)
if (--indegree[p->adjvex] == 0) //若入度减为0则入栈
stack[top++] = p->adjvex;
}// while
printf("\n");
}
/**
6
1 2 0
1 3 0
1 4 0
3 2 0
3 5 0
4 5 0
6 4 0
6 5 0
0 0 0
*/
测试输出:

本文介绍了一种使用邻接表存储结构实现的拓扑排序算法,并提供了详细的算法步骤及伪代码。该算法首先计算每个顶点的入度,然后将入度为0的顶点压入栈中,通过不断移除栈顶元素并更新其相邻节点的入度,最终实现拓扑排序。

400

被折叠的 条评论
为什么被折叠?



