【数据结构】有向无环图(AOV-网)的拓扑排序(C语言)

本文介绍了有向无环图(AOV-网)的拓扑排序,讲解了拓扑序列的概念、特性,并详细阐述了基于邻接表的拓扑排序算法,包括基本思想和完整C语言实现,最后展示运行结果。
摘要由CSDN通过智能技术生成

1. 拓扑序列

有向无环图是指一个无环的有向图。有向无环图可用来描述工程或系统的进行过程,如一个工程的施工图、学生课程间的制约关系图等。
用顶点表示活动,用弧表示活动间优先关系的有向无环图,称为顶点表示活动的网,简称AOV-网
拓扑序列:在有向图G =(V,{E})中,V中顶点的线性序列(v1,v2,v3,…,vn)称为拓扑序列。如果此序列满足条件:对序列中任意两个顶点vi,vj,在G中有一条从vi到vj的路径,则在序列中vi必排在vj之前。
拓扑序列
AOV-网的特性
① 若 vi 为 vj 的先行活动,vj 为 vk 的先行活动,则 vi 必为 vk 的先行活动,即先行关系具有可传递性。
② AOV-网的拓扑序列不唯一。如上图有向无环图的另一个拓扑序列为:C1,C2,C3,C8,C4,C5,C9,C7,C6。
拓扑排序(Topological Sort)的基本思想
① 从有向图中选择一个无前驱的结点输出;
② 将此结点和以它为起点的边删除;
③ 重复①、②直到不存在无前驱的结点;
④ 若此时输出的结点数小于有向图中的顶点数,则说明有向图中存在回路,否则输出的顶点的顺序即为一个拓扑序列。
示例
实现过程

2. 拓扑排序的实现(以邻接表为例)

2.1 基本思想

入度为0的顶点即没有前驱的顶点,对于邻接表结构可以附设一个存放各顶点入度的数组indegree[],于是有:
① 找G中无前驱的结点——查找indegree[i]为0的顶点i;
② 删除以 i 为起点的所有弧——对链在顶点 i 后面的所有邻接顶点 k,将对应的indegree[k]减1;
:若存储结构为邻接矩阵,则
① 找G中无前驱的结点——在邻接矩阵中找到值全为0的列;
② 删除以 i 为起点的所有弧——将矩阵中 i 对应的行全部置为0;)

为避免重复检测入度为0的顶点,可以设置一个辅助栈,若某一顶点的入度减为0,则将它入栈,每当输出某一顶点时,便将它从栈中删除,即出栈。

2.2 完整实现代码及运行结果

# include<stdio.h>
# include<malloc.h>
# define MAX_VERTEX_NUM 20
# define TRUE 1
# define FALSE 0

/*图的邻接表表示法*/
typedef char VertexData;
//弧结点结构
typedef struct ArcNode {
   
	int adjvex;								//该弧指向顶点的位置
	struct ArcNode* nextarc;				//指向下一条弧的指针
}ArcNode;
//表头结点结构
typedef struct VertexNode {
   
	VertexData data;						//顶点数据
	ArcNode* firstarc;						//指向该顶点的第一条弧的指针
}VertexNode;
//邻接表结构
typedef struct {
   
	VertexNode vertex[MAX_VERTEX_NUM];
	int vexnum, arcnum;						//图的顶点数和弧数
}AdjList;

/*求顶点位置*/
int LocateVertex(AdjList* G, VertexData v) {
   
	int k;
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值