拓扑排序
无环图:一个无环的有向图,简称DAG图。
AOV网:在一个表示工程的有向图中,用顶点表示活动,弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,称之为AOV网。
拓扑序列:设G(V, E)是一个具有n个顶点的有向图,V中的顶点序列V1,V2…Vn满足若从顶点Vi到Vj有一条路径,则在顶点序列中顶点Vi必在顶点Vj之前,则我们称这样的顶点序列为一个拓扑序列。
拓扑排序:对一个有向图构造拓扑序列的过程。
拓扑排序算法
方法和步骤如下:
- 从AOV网中选择一个没有前驱的顶点(该顶点的入度为0),并且输出
- 从网中删去该顶点,并且删除从该顶点发出的全部有向边
- 重复上述两步,直到剩余网中不再存在没有前驱顶点为止
可以用邻接表的数据结构表示
表示为邻接表
部分代码实现:
//边表结点声明
typedef struct EdgeNode
{
int adjvex;
struct EdgeNode *next;
}EdgeNode;
//顶点表结点声明
typedef struct VertexNode
{
int in;
int data;
EdgeNode *firstedge;
}VertexNode, AdjList[MAXVEX];
typedef struct
{
AdjList adjList;
int numVertexes,numEdges;
}graphAdjList,*GraphAdjList;
//拓扑排序算法
//若GL无回路,则输出拓扑排序序列并返回OK,否则返回ERROR
Status TopologicalSort(GraphAdjList GL)
{
EdgeNode *e;
int i ,k, gettop;
int top = 0; //栈指针下标索引
int count = 0; //用于统计输出顶点的个数
int *stack; //存储入度为0的顶点
stack = (int *)malloc(GL->numVertexes *sizeof(int));\
for( i =0; i< GL->numVertexes ;i ++)
{
if( 0 == GL->adjList[i].in)
{
stack[++top] = i; //将度为0的顶点下标入栈
}
}
while( 0 != top )
{
gettop = stack[top--]