学习笔记:数据结构与算法(十六):拓扑排序和关键路径

学习笔记:数据结构与算法(十五):拓扑排序和关键路径

拓扑排序

无环图:一个无环的有向图,简称DAG图。
AOV网:在一个表示工程的有向图中,用顶点表示活动,弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,称之为AOV网。
拓扑序列:设G(V, E)是一个具有n个顶点的有向图,V中的顶点序列V1,V2…Vn满足若从顶点Vi到Vj有一条路径,则在顶点序列中顶点Vi必在顶点Vj之前,则我们称这样的顶点序列为一个拓扑序列。
拓扑排序:对一个有向图构造拓扑序列的过程。

拓扑排序算法

方法和步骤如下:

  1. 从AOV网中选择一个没有前驱的顶点(该顶点的入度为0),并且输出
  2. 从网中删去该顶点,并且删除从该顶点发出的全部有向边
  3. 重复上述两步,直到剩余网中不再存在没有前驱顶点为止

可以用邻接表的数据结构表示
在这里插入图片描述
表示为邻接表
在这里插入图片描述
部分代码实现:

//边表结点声明
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--]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值