AOV网的定义
以顶点表示活动,以有向边表示活动之间的优先关系的有向图称为顶点表示活动的网(Activity On Vertex Network),简称AOV网。
例如:计算机专业课学习流程
为保证流程可执行,AOV网中不应该出现回路。
拓扑排序
拓扑序列:设G=(V,E)是一个具有n个顶点的有向图,V中的顶点序列v1,v2,…,vn,满足若从顶点vi到vj有一条路径,则在顶点序列中顶点vi必在顶点vj之前
拓扑排序:构造拓扑序列的过程
拓扑排序方法:
-
从AOV网中选择一个没有前驱的顶点,并输出;
-
从AOV网中去掉该顶点以及以该顶点为出发点的所有边;
-
重复上述过程,直到AOV网中的不存在入度为0的顶点。
判断有无回路:
完成3后,如果AOV网中还有顶点,说明有回路;反之,说明所有顶点都被输出,即没有回路。
例如:(红圈表示当前删除顶点)
算法
存储结构——邻接表
typedef struct AOVedge{
int adj; //该边的终止顶点在顶点结点中的位置
int weight; //边的权值
struct AOVedge *next; //指向下一个边结点
}AELink;
typedef struct AOVver{
int indegree; //顶点的入度
int vertex; //顶点信息
AELink *link; //指向第一个边结点
}TOPOVLink;
代码实现
void TOPO_sort(TOPOVLink G[],int n,int V[]) //G[]为顶点结点数组,n为顶点个数,V[]为存放拓扑序列的数组
{
AELink *p;
int i,j,k,top=-1;
for(i=0;i<n;i++) //栈初始化:将原图入度为0的顶点进栈
{
if(G[i].indegree==0)
{
G[i].indegree=top; //用数组实现链表功能
top=i; //top是当前入度为0的下标,G[top].indegree是前一个下标
}
}
for(i=0;i<n;i++)
{
if(top==-1) //top==-1本该在n个结点输出后再出现,但提前了,说明图中还剩结点但入度均非0
{
printf("\n网中存在回路!\n");
break;
}
else //如果一直走这条支路,没走if,说明n个结点依次被输出,不存在回路
{
j=top;
top=G[top].indegree; //退出栈顶元素
V[i]=G[j].vertex; //输出一个顶点的信息
p=G[j].link;
while(p!=NULL) //“删除”边结点,并寻找新的入度为0的点
{
k=p->adj;
G[k].indegree--; //已进栈说明入度为0,此步不会修改栈中顶点的indegree
if(G[k].indegree==0)
{
G[k].indegree=top;
top=k;
}
p=p->next;
}
}
}
}
算法分析
设AOV网中有n个顶点,e条边。初始化循环时间为O(n),出栈共n次,对每个顶点的边进行删除共进行e次,从而算法时间复杂度为O(e+n)。
标签:int,indegree,拓扑,AOV,顶点,排序,网中 From: https://www.cnblogs.com/chasetsai/p/18212117