Application object: 有向无环图(Directed Acyclic Graph简称DAG)
AOV网:在表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,即AOV网(Activity On Vertex Network)
拓扑序列(Topological Order):设G=(V,E)是一个具有n个顶点的有向图,V中的顶点序列v1,v2,......,vn,满足若从顶点vi到vj有一条路径,则在顶点序列中顶点vi必须在顶点vj之前,如此顶点序列。
若此网输出全部顶点,则说明它不存在环(回路)的AOV网;反之存在环(回路),不是AOV网
基本思路:AOV网中选择入度为0的顶点输出,然后删除输出的顶点,并删除此顶点为尾的弧,继续重复此不舟,直到所有顶点被输出或AOV网中不存在入度为0的顶点为止。
例:
创建邻接表: in | data | firstedge -> adjvex | next
Code:
typedef struct EdgeNode
{
int adjvex;
int weight;
struct EdgeNode *next;
}EdgeNode;
typedef struct VertextNode
{
int in;
int data;
EdgeNode *firstedge;
}VertexNode,AdjList[MAXVEX];
typedef struct
{
AdjList adjList;
int numVertexes,numEdges;
}graphAdjList,*GraphAdjList;
Status TopologicalSort(GraphAdjList GL)
{
EdgeNode *e;
int i,k,gettop;
int top=0;
int count = 0;
int *stack;
stack = (int *)malloc(GL->numVertexes * sizeof(int));
for(i = 0; i<GL->numVertexes; i++)
if(GL->adjList[i].in == 0)
stack[++top] = i;
while(top != 0)
{
gettop = stack[top--];
printf("%d -> ",GL->adjList[gettop].data);
count++;
for(e = GL->adjList[gettop].firstedge; e; e=e->next)
{
k = e->adjvex;
if(!(--GL->adjList[k].in))
stack[++top] = k;
}
}
if(count < GL->numVertexes)
return ERROR;
else
return OK;
}