数据结构之图论算法(四)—— 拓扑算法

7 篇文章 3 订阅
订阅专栏

一、有向无环图(DAG图):无环的有向图

应用示例1:

  • 描述含公共子式的表达式的工具——实现对相同子式的共享,从而节省存储空间;
    在这里插入图片描述

应用示例2:

  • 描述工程项目或系统过程的工具
  • 工程可分为若干个成为活动的子工程;
  • 子工程间存在一定约束,如某些子工程的开始必须在另一些子工程完成之后
  • 主要关心的问题
  • 1.工程是否能顺利进行;
  • 2.整个工程完成所必须的最短时间。

二、AOV网和拓扑排序

AOV网:

结点为活动,弧的指向表示活动执行的次序
在这里插入图片描述

AOE网:

结点为事件,弧表示活动,权表示活动持续时间在这里插入图片描述

1. AOV网:

代表的一项工程中活动的集合,是个偏序集合

  • 偏序: 若集合X上的关系R是传递的、自反的、反对称的,则称R是集合X上的偏序关系
  • 全序:若关系R是集合X上的偏序关系,如果对于每个x,y∈X,必有x R y 或 y R x,则称R是集合X上的全序关系
2. 拓扑排序(Topological Sort):

由某个集合上的一个偏序得到该集合上的一个全序

AOV网表示流程:

  • 流程图——表示偏序的有向图:
  • 用 ai–>aj表示(ai,aj)∈R,i < j;
  • 为了表示方便,令ai为前驱,二aj为后继,表明两者之间的次序关系(领先/优先关系)
  • 用途:描述工程项目或系统进行的次序
用AOV网进行拓扑排序:
方法1:

(1)在有向图中选取一个没有前驱的顶点输出之;
(2)从图中山区该顶点和所有以它为尾的弧。
重复(1)、(2)直至全部顶点都已输出,或者当前图中不存在无前驱的顶点为止,或一种情况说明图中存在环。

  • 不存在环时:在这里插入图片描述

  • 存在环时:在这里插入图片描述
    最后还会留下边!!

方法2:

当有向图中无环时,可利用深度优先遍历进行拓扑排序,即顶点退出DFS函数的先后次序的逆序

拓扑排序的算法思想:

【数组表示法】:

  1. 找到全为0的第j列,输出j;
  2. 将第j行的全部元素置为0;
    ···
    反复执行1、2直至所有元素输出完毕。
    在这里插入图片描述
时间复杂度:O(n³)

由上述的数组表示法可知,只要创建一个数组来表示每个结点的入度为多少即可

若某一个点入度为0,那么就可以输出该点,同时将该点相连的各个点的入度-1,然后再在该数组中寻找下一个入度为0的点。

整理一下思路:(对于邻接矩阵)

在这里插入图片描述
在这里插入图片描述

所以拓扑序列为:1,3,2,6,5,4,7

算法实现:(前期准备部分,包括图的定义和栈的定义以及相关调用函数)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_VERTEX_NUM 20
typedef int InfoType
//边的定义
typedef struct ArcNode{
	int adjvex;	//表示该边指向的顶点的位置
	InfoType *info;	//和边相关的信息
	struct ArcNode *nextarc;	//指向下一条边
}ArcNode;
//顶点的定义
typedef int VertexType; 

typedef struct VNode{
	VertexType data;	//顶点信息
	ArcNode *firstarc;	//指向第一条依附该顶点的边的指针,所以指针类型应为边的类型
}VNode,AdjList[MAX_VERTEX_NUM];	//AdjList表示邻接表类型
//图的定义
typedef struct{
	AdjList vertices;	//vertices是vertex的复数
	int vexnum, arcnum;	//图的当前顶点数和边数
}ALGraph;
//栈的定义
typedef struct{
	int *base, *top;
	int stacksize;
}Stack;

typedef enum{ERROR, OK, TRUE, FALSE} Status;
//初始化栈
Status InitStack(Stack &S, int vexnum){
	S.base = (int *)malloc((vexnum+1) * sizeof(int));
	if(!S.base)	exit(-1);
	S.top = S.base;
	S.stacksize = vexnum;
	return OK;
}

//进栈:
Status Push(Stack &S, int elmt){
	if(S.top-S.base == S.stacksize)
		return ERROR;
	*S.top++ = elmt;
	return OK;
}
//入度数组的初始赋值
void findinDegree(ALGraph G,int indegree[]){
	int i;
	for(i = 0; i < G.vexnum; i++){
		ArcNode *p = G.vertices[i].firstarc;
		while(p){
			indegree[p->adjvex]++;
			p = p->nextarc;
		}
	}
}
//栈是否为空的判断
Status StackEmpty(Stack &S){
	if(S.base == S.top) return TRUE;
	else return FALSE;
}
//出栈
Status Pop(Stack &S, int &i){
	i = *--S.top;	//先下移,然后把栈顶元素存到i中,即先出栈的顶点的地址
	//注意,Stack中存放的是顶点表的下标信息,所有vertices[i]是表示一个顶点元素;
}

拓扑排序:(正片部分)

Status Topological(ALGraph G){
	//创建栈和indegree数组并将它们初始化:
	int indegree[MAX_VERTEX_NUM] = {0};
	Stack S;
	int i;
	InitStack(S, G.vexnum);
	findinDegree(G,indegree);
	for(i = 0; i < G.vexnum; i++)
		if(!indegree[i]) Push(S, i);	//如果indegree[i]为空,则进栈
	int count = 0;
	while(!StackEmpty (S)){	//若栈非空,假设由n个进栈,那么就出栈n个
		Pop(S,i);count++;	//栈顶元素(某一结点)出栈,并且该结点所对应的下标信息传递给i,因此该点为vertices[i]
		//将所有相关连接点的入度-1
		for(ArcNode *p = G.vertices[i].firstarc; p; p = p->nextarc){
			int k = p->adjvex;	//把与vertices[i]连接的所有结点的下标信息放到k中
			if(!(--indegree[k]))	Push(S,k);	//若点vertices[k]的入度在-1之后为0,那么入栈。
		}
	}
	if(count < G.vexnum) return ERROR;	//如果入栈的结点少于图的结点数,那么图中含有环,返回ERROR
	else return OK;
}

结合代码在分析整个过程:
在这里插入图片描述

简洁明了的拓扑算法讲解
weixin_42373888的博客
08-11 9516
拓扑图: 算法思想:类似于二叉树的层次遍历,遍历所有结点,将入度为0的结点存在一个栈中,依次输出栈内的各个结点时,将每个节点的子节点的度减1,然后将其中度为0的结点存入栈中,循环执行上述操作,直到所有结点遍历完。 举个例子,如下图所示 第一步,(A,B,C,D,E)的度数分别为(0,2,1,3,0)先将入度为0的结点存入栈中,(A,E)入栈,A出栈,则相应的结点D的度数3减变为2...
拓扑算法
Qinhaifu的博客
02-13 4184
拓扑算法 一、用途 拓扑排序应用非常广泛,解决的问题的模型也非常一致。凡是需要通过局部顺序来推导全局顺序的,一般都能用拓扑排序来解决。除此之外,拓扑排序还能检测图中环的存在。 例如:先穿内衣再穿外套,先穿袜子再穿鞋子,先穿内裤再穿裤子。根据局部顺序推导全局顺序为:内衣->外套->袜子->鞋子->内裤->裤子(结果不止一种,因为先穿袜子还是内衣没有顺序) 二、原理 把依...
拓扑排序详解(包含算法原理图解、算法实现过程详解、算法例题变式全面讲解等)
aliyonghang的博客
05-06 8802
非常详细的讲解。点开有惊喜!
拓扑排序及算法实现
ShyTan的博客
04-21 9806
一、拓扑排序概念 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。 简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。 二、理解 在一个有向图中,对所有的节点进行排序,要求没有一个节点指向它前面的节点。...
拓扑排序算法详讲
qq_43735092的博客
08-15 6100
经过一天的专研,终于明白了拓扑排序算法,写篇博客记录一下心得. 一.拓扑排序介绍 在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们称为AOV网. 设G=(V,E)是一个具有n个顶点的有向图,v中的顶点序列v1,v2…,vn,满足若从顶点到v1到vj有一 条路径,则在顶点序列中顶点vi必须在顶点vj之前,我们称这样的顶点序列为一个拓扑序列....
图论--------拓扑排序相关讲解以及题目
weixin_43743711的博客
08-23 1433
前言: 引用百度百科的话: 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。 简单来说: 一个图的所有节点排序,使得每一条有向边(u,v)对应的u都排在v的前面
算法 图的表示、拓扑图、最小生成树
liyanlei的专栏
07-23 663
本篇文章根据左程云视频教程整理而来 https://www.bilibili.com/video/BV11v411G7xR?p=5 一、图的表示方式 1、 邻接边法 2、邻接矩阵 邻接value=边的权重,否则value=∞ 3 、图结构的算法,把题目给的结构,写一个转换器,转化为自己喜欢的图结构,然后再求解 4、推荐的表示图的数据结构 1)结点 2)边 3)图 5、把邻接矩阵转化为图的推荐的数据结构 三、表遍历 1、广度优先遍历 2、深度优先遍历 ...
大数据-算法-拓扑图论中的有关问题.pdf
04-20
大数据-算法-拓扑图论中的有关问题.pdf
算法-图论模板(java实现)
05-29
经典图论算法题的模板实现,包括最短路,宽搜深搜,拓扑序列,二分图等问题。作者参加算法比赛的利器。现在免费送给你。适合参加蓝桥杯、PAT等算法比赛或者面试的图论基础知识。
MATALB图论算法软件-免编程可直接运行可视化图论算法软件
08-02
软件功能介绍——可视化图论算法软件 该软件是用来求解图论算法。其可求解的算法有:最短路径、最小生成树、拓扑排序、 关键路径、最大流、最小费用最大流,利用最大流还可求解二部图的最大匹配。 使用流程 1.选择图...
图论算法PPT
02-07
图论算法包括:图的存储与遍历,最小生成树,最短路径,拓扑排序等
数据结构---设计---图论---有向无环图及其应用---【拓扑排序】
软件程序媛的博客
12-28 1789
数据结构 设计
拓扑排序的算法实现
一杯苦芥的专栏
05-31 575
111
拓扑排序算法
芝麻年糕的博客
10-31 179
熟悉java项目的同学,我可能会比较容易解释这个概念,在java项目中,一般会用到第三方jar包,而这些jar包可能会依赖其他的jar包,这样就形成了拓扑图。而在拓扑中,必定有一个jar包是不依赖其他任何jar包的,也就是入度为零的源节点,而且jar包不能互相形成循环,否则会出问题。 所以拓扑排序适用于有向图,且必有入度为0的节点,不能有环 public class TopologySort { private static List<Node> sortedTopology(Grap
拓扑排序算法详解
shao1996的博客
11-10 5611
一、定义:是将一个有向无环图G的所有的顶点排成一个线性序列,使得有向图中的任意的顶点u 和 v 构成的弧属于该图的边 集,并且使得 u 始终是出现在 v 的前面。通常这样的序列称为是拓扑序列。 注意: 只有有向无环图才可以进行拓扑排序 二、算法思想: 1.找到有向无环图中没有前驱的节点(或者说是入度为0的节点)输入; 2.然后从图中将此节点删除并且删除以该节点为尾的弧;
【每日算法】图算法(遍历&MST&最短路径&拓扑排序)
jiange_zh的博客
02-28 7869
图有邻接矩阵和邻接表两种存储方法,邻接矩阵很简单,这里不讨论,下面我们先看看常用的邻接表表示方法。 邻接表常用表示方法 指针表示法 指针表示法一共需要两个结构体: struct ArcNode //定义边表结点 { int adjvex; //邻接点域 ArcNode* next; }; struct VertexNode //定义顶点表结点 { int
拓扑路径详细原理
Superb_day
07-17 9502
一、拓扑排序概述 一场大型工程,我们往往把它看做多个子工程的集合体,这些小工程有的相互连接,一个是一个的子工程,有的相互并列,共处于一个工程的顺序之下,我们可以画一个图来表示这个工程和这些子工程的联系,它称为AOV网。 举个例子:小S作为班级的学习委员,掌管全班的收发作业,他手下还有一些班干部,但是作业实在太多了,而且人手有限,不可能同时收发所有科目作业,所以,他决定权衡利弊,优先收脾气不好的...
python图论算法
最新发布
08-22
Python 中有许多用于图论算法的库和模块。下面是一些常用的图论算法及其对应的 Python 库: 1. 最短路径算法: - Dijkstra 算法:可以使用 NetworkX 库的 `shortest_path` 函数或者使用 `heapq` 模块自己实现。 - Floyd-Warshall 算法:可以使用 NetworkX 库的 `floyd_warshall` 函数。 2. 最小生成树算法: - Kruskal 算法:可以使用 NetworkX 库的 `minimum_spanning_tree` 函数。 - Prim 算法:可以使用 NetworkX 库的 `minimum_spanning_tree` 函数。 3. 深度优先搜索和广度优先搜索: - 可以使用 NetworkX 库中的 `dfs` 函数和 `bfs` 函数。 4. 拓扑排序: - 可以使用 NetworkX 库中的 `topological_sort` 函数。 5. 最大流算法: - Ford-Fulkerson 算法、Edmonds-Karp 算法或者 Dinic 算法:可以使用 NetworkX 库的 `maximum_flow` 函数。 这些只是图论算法的一小部分,还有其他许多算法和库可供选择,具体选择取决于你的需求和数据结构。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • c++中关于vector容器的各种函数介绍 15974
  • 类模板及其成员函数的定义及注意事项 7179
  • 数据结构之图论算法(四)—— 拓扑算法 5600
  • IP数据报格式 3213
  • 数字电路与逻辑设计之集成触发器 3187

分类专栏

  • 基础知识 4篇
  • 数字电路与逻辑设计 1篇
  • 计算机网络 2篇
  • 数据结构学习笔记 7篇
  • c++ 2篇

最新评论

  • IP数据报格式

    ThReE_73: 表述太不严谨了,一个ip数据报才四字节,你一个首部就20字节了,6!

  • IP数据报格式

    燃烧的心: 那个标识为啥是12345啊

  • 数据结构之图论算法(四)—— 拓扑算法

    ctotalk: 加油,不错。

  • 数字电路与逻辑设计之集成触发器

    不吃西红柿丶: 非常有用,谢谢大佬整理~

大家在看

  • 测试bert_base不同并行方式下的推理性能
  • 【C++初阶学习】第十三弹——优先级队列及容器适配器 2165
  • Python3 笔记:字符串的 zfill() 和 rjust() 224
  • MySQL之高级特性(三)
  • sam_out 脱发预测 568

最新文章

  • IP数据报格式
  • 地址解析协议ARP
  • 数字电路与逻辑设计之集成触发器
2021年2篇
2020年12篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

深圳SEO优化公司西安网站优化排名推荐伊犁模板网站建设价格莆田网站制作设计推荐安庆seo优化哪家好潮州seo公司韶关如何制作网站海北网站搜索优化多少钱临猗模板制作报价坪山网站优化按天计费报价延边SEO按天扣费公司株洲百姓网标王报价迁安百度关键词包年推广荷坳网站推广工具多少钱滁州阿里店铺托管推荐通辽百度seo多少钱醴陵推广网站长治seo网站优化推荐吉林企业网站设计多少钱坂田网站排名优化推荐西宁网络营销报价延边网站开发公司漯河网站改版价格长葛推广网站宜春百度标王平凉关键词排名包年推广报价太原网站推广系统推荐黄冈SEO按效果付费金华SEO按效果付费哪家好常州百姓网标王哪家好达州优秀网站设计价格歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化