拓扑排序介绍
拓扑序列:设G=(V,E)是一个具有n个顶点的有向图,V中的顶点序列:V1,V2,V3,…,Vn,满足若从顶点Vi到Vj有一条路径,则在顶点序列中顶点Vi比在顶点Vj之前。我们称这样的顶点序列为一个拓扑序列。
**拓扑排序:**就是对一个有向图构造拓扑序列的过程。
拓扑排序算法
算法的实现是基于邻接表的存储结构。
代码思想:
1 定义一个栈(stack)存储没有入度的顶点序号,定义top指向栈顶,定义count记录输出的顶点个数,以便判断是否有环存在。
2 初始化stack,把所有入度为0的顶点入栈。
3 在栈不为空的情形下进行循环:出栈,并打印这个顶点信息,count++。接下来通过循环访问该顶点的邻接表,并对弧头的入度in减一,如果in等于0,则需要把该顶点入栈。
4 最后判断count是否等于顶点数。
代码如下:
int TopologicalSort(GraphVerter G)
{
EdgeNode *e;
int i;
int top = 0;
int gettop;
int count = 0;
int *stack;
stack = (int *)malloc(G.numvertexes * sizeof(int));
for(i = 0; i < G.numvertexes; i++)
{
if(G.verter[i]->in == 0)
stack[++top] = i;
}
while(top != 0)
{
gettop = stack[top--];
printf("%d",G.verter[gettop]->data);
count++;
for(e = G.verter[gettop]->firstedge; e ; e = e->next)
{
G.verter[e->adjvex]->in--;
if(G.verter[e->adjvex]->in == 0)
stack[++top] = e->adjvex;
}
}
if(count < G.numvertexes)
return 0;
else
return 1;
}