AOV-网:
一个无环的有向图称作有向无环图(Directed Acycline Graph), 简称DAG图。
用顶点表示活动,用弧表示活动间的优先关系的有向图称为顶点表示活动的网(Activity On Vertex Netwrok) ,简称AOV-网
拓扑排序:
所谓拓扑排序就是将AOV-网中所有顶点排成一个线性序列。
作用:可用来判断图或网中是否有环。检测的办法是对有向图的顶点进行拓扑排序,若网中所有顶点都在它的拓扑有序序列中,则该AOV-网中必定不存在环,否则有环。
除了用拓扑排序判断图有无环外,深度优先遍历同样也能判断。
具体步骤:
(1) 在有向图中选一个无前驱的顶点且输出它。
(2) 从图中删除该顶点和所有以它为尾的弧(代码可用弧头顶点的入度减1的办法来实现)。
(3) 重复 (1) 和 (2), 直至不存在无前驱的顶点。
(4) 若此时输出的顶点数小千有向图中的顶点数,则说明有向图中存在环,否则输出的顶点序列即为一个拓扑序列。
以该图为例:
代码如下:
#include<stdio.h>
#define MVNum 100
typedef char OtherInfo;
typedef char VerTexType;
//图的邻接表存储结构
typedef struct ArcNode //边结点
{
int adjvex; //邻接点域
struct ArcNode *nextarc;//链域
OtherInfo info; //数据域
}ArcNode;
typedef struct VNode //顶点信息
{
VerTexType data;//数据域
ArcNode *firstarc;//链域
}VNode, AdjList[MVNum];
typedef struct //邻接表
{
AdjList vertices;
int vexnum, arcnum;
}ALGraph;
//函数声明
int LocateVex(ALGraph G, char v);
void LinkAL(ALGraph &G, int i, int j);
void FindInDegree(ALGraph G, int indegree[]);
void printTopo(int topo[], int m);
//邻接表创建有向图
void CreateUDG(ALGraph &G)
{
G.vexnum = 6; //输入总顶点数和边数
G.arcnum = 8;
G.vertices[0].data = 'v1'; //输入顶点信息
G.vertices[0].firstarc = NULL;
G.vertices[1].data = 'v2';
G.vertices[1].firstarc = NULL;
G.vertices[2].data = 'v3';
G.vertices[2].firstarc = NULL;
G.vertices[3].data = 'v4';
G.vertices[3].firstarc = NULL;
G.vertices[4].data = 'v5';
G.vertices[