数据结构-图的遍历和应用(DAG、AOV、AOE网)

news2024/10/5 7:37:17

目录

*一、广度优先遍历(BFS)

广度优先生成树

广度优先生成森林

*二、深度优先遍历

深度优先生成树

深度优先生成森林

二、应用

2.1最小生成树

*Prim算法

*Kruskal算法

2.2最短路径

 *BFS算法

*Dijkstra算法

 *Floyd算法

*2.3有向无环图(DAG网)

 *2.4拓扑排序(AOV网)

*逆拓扑排序

 *2.5关键路径(AOE网)

*一、广度优先遍历(BFS)

类似树的广度遍历

 FirstNeighbor(G,x):求图G中顶点x的第一个邻接点,若有则返回顶点号,没有返回-1

NextNrighbor(G,x,y):假设图G中顶点y是顶点x的邻接点,返回除y之外顶点x的下一个邻接点的顶点号,若y就是最后一个返回-1

bool visited[MAX_VERTEX_NUM];        //访问标记数组
void BFS(Graph G,int v){
    visit(v);                        //访问初始顶点v
    visited[v]=TRUE;                 //对v做已访问标记
    Enqueue(Q,v);                    //入队列
    while(!isEmpty(Q)){              
        Dequeue(Q,v);                //顶点v出队
        for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w)){ //检测v所以邻接点
            if(!visited[w]){
                visit(w);            //访问顶点w
                visited[w]=TRUE;     //对w做已访问标记
                Enqueue(Q,w);        //入队列
            }
        }
    }
}
void BFSraverse(Graph G){
    for(i=0;i<G.vexnum;++i)
        visired[i]=FASLE;        //初始化标记数组
    InitQueue(Q);                //初始化辅助队列
    for(i=0;i<G.vexnum;++i)
        if(!visited[i])          //对每个连通分量调用一次BFS
            BFS(G,i);
}

空间复杂度:最坏。辅助队列O(V)

邻接矩阵时间复杂度:\tiny O(V^2)

邻接表时间复杂度:\tiny O(V+E)

广度优先生成树

    邻接表生成不唯一,具体看数据先后顺序

广度优先生成森林

        一个连通分量一个树,多个(非连通图)就是森林

*二、深度优先遍历

类似树的先序遍历

bool visited[MAX_VERTEX_NUM];      //访问标记数组
void DFS(Graph G,int v){
    visit(v);                      //访问v
    visited[v]=TRUE;               //标记已访问
    for(w=FirstNeighbor(G,V);w>=0;w=NextNeighor(G,v,w))    //邻接顶点
        if(!visited[w]){
            DFS(G,w);   
        }

}
void DFSraverse(Graph G){
    for(v=0;v<G.vwxnum;++v)
        visited[v]=FALSE;
    for(v=0;v<G.vexnum;++v)
        if(!visited[v])
            DFS(G,v);
}

空间复杂度:最后O(1)  ,最坏情况:O(V)

邻接矩阵时间复杂度:\tiny O(V^2)

邻接表时间复杂度:\tiny O(V+E)

邻接表存储顺序性不一致,遍历序列不一样

深度优先生成树

    邻接表生成不唯一,具体看数据先后顺序

深度优先生成森林

        一个连通分量一个树,多个(非连通图)就是森林

二、应用

2.1最小生成树

*Prim算法

从某一个顶点开始构建生成树;每一次将代价最小的新顶点纳入生成树,直到所有顶点都纳入为止

时间复杂度\tiny O(V^2)    适用于边稠密图

*Kruskal算法

每次选择一条权值最小边,使这条边两头连通(已经连通不用),直到所有结点连通

时间复杂度\tiny O(elog_2e)  适合用于边稀疏图

2.2最短路径

 *BFS算法

*Dijkstra算法

 *Floyd算法

  动态规划思想

 

 每轮看\tiny A^{-1}[i][j]>A^{-1}[i][n]+A^{-1}[n][j] ,n为第几轮,n也就是几个顶点为中转点

\tiny A^{(2)}=A\tiny A^{(-1)}\tiny A^{(0)}\tiny A^{(1)}\tiny A^{(2)}
\tiny V_0\tiny V_1\tiny V_2\tiny V_0\tiny V_1\tiny V_2\tiny V_0\tiny V_1\tiny V_2\tiny V_0\tiny V_1\tiny V_2
\tiny V_00613061306100610
\tiny V_110041004100490\tiny V_0->V_1->V_24
\tiny V_250511551105110

 中转点为第几轮换的就是几

\tiny path^{(2)}=\tiny V_0\tiny V_1\tiny V_2
\tiny V_0-1-11
\tiny V_12-1-1
\tiny V_2-10-1

 第一轮(\tiny A^{(0)}):\tiny A^{-1}[i][j]>A^{-1}[i][0]+A^{-1}[0][j],更新值

 第二轮(\tiny A^{(1)}):\tiny A^{-1}[i][j]>A^{-1}[i][1]+A^{-1}[1][j]

 第三轮(\tiny A^{(2)}):\tiny A^{-1}[i][j]>A^{-1}[i][2]+A^{-1}[2][j]

几个顶点几轮

根据上面\tiny A^{(2)}可知\tiny V_1\tiny V_2最短路径为4,根据\tiny path^{(2)}为-1没有中转,路径为\tiny V_1->V_2

根据上面\tiny A^{(2)}可知\tiny V_0\tiny V_2最短路径为10, 根据\tiny path^{(2)}为1,经过\tiny V_1顶点中转,路径为\tiny V_0->V_1->V_2

for(int k=0;k<n;lk++){                       //考虑vk为中转点
    for(int i=0;i<n;i++){                    //遍历矩阵,i行,j列
        for(int j=0;j<n;j++){
            if(A[i][j]>A[i][k]+A[k][j]){     //以vk为中转点的路径更短
                A[i][j]=A[i][k]+A[k][j];     //最短路径
                path[i][j]=k;                //中转点
            }
        }
    }
}

 时间复杂度:\tiny O(V^3)

空间复杂度:\tiny O(V^2)

*2.3有向无环图(DAG网)

        若一个有向图中不存在环,则称为有向无环图,简称DAG图

 有向无环图是描述含有公共子式的表达式的有效工具,列如表达式\tiny ((a+b)*(b*(c+d))+(c+d)*e)*((c+d)*e)

 DAG不可能出现重复操作数

 *2.4拓扑排序(AOV网)

AOV网:若用DAG图表示一个工程图,其顶点表示活动,用边表示活动\tiny V_i必选先于活动\tiny V_j进行的这样一种关系,则这种有向图称顶点表示活动的网络,记为AOV网。\tiny V_i\tiny V_j的直接前驱,\tiny V_j\tiny V_i直接后继,不能自己做自己的前驱和后继。每个工程只出现一次

 

 

 时间复杂度:\tiny O(V+E)

若采用邻接矩阵则\tiny O(V^2)

*逆拓扑排序

 *2.5关键路径(AOE网)

        在带权有向图中,以顶点表示事件,以有向边表示活动,以边上的权值表示完成该活动的        开销(如时间),称之为用边表示活动的网络,简称AOE网

源点:AOE网仅有一个入度未0的顶点,称为开始顶点(源点),表示工程的开始。

汇点:也仅有一个出度为0的顶点,称结束顶点(汇点),表示工程的结束

关键路径:从源点到汇点路径可能有多条,所有路径中,路径出度最大的为关键路径

事件(顶点)\tiny v_k最早发生时间\tiny ve(k):决定了所有从\tiny v_k开始的活动能够开工的最早时间

活动(边)\tiny a_i的最早开始时间\tiny e(i):指该活动弧的起点所表示事件的最早发生时间

事件\tiny v_k的最迟发生时间\tiny vl(k):指不推迟整个工程前提下,事件最迟必选发生的时间\tiny e(i)=ve(k)

 活动(边)\tiny a_i的最迟开始时间\tiny l(i):指活动弧的终点所表示事件的最迟发生时间与该活动所需时间之差。\tiny l(i)=vl(i)-Weight(v_k,v_j) 

时间余量:\tiny d(i)=l(i)-e(i)

 关键活动、关键路径的特性

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/508784.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java之线程安全

目录 一.上节回顾 1.Thread类常见的属性 2.Thread类中的方法 二.多线程带来的风险 1.观察线程不安全的现象 三.造成线程不安全现象的原因 1.多个线程修改了同一个共享变量 2.线程是抢占式执行的 3.原子性 4.内存可见性 5.有序性 四.解决线程不安全问题 ---synchroni…

【Win32绘图编程,GDI绘图对象】绘图基础,位图处理,绘图消息处理,画笔,画刷,文本绘制

这一篇文章分享本人学习win32绘图编程&#xff0c;其中包括GDI绘图对象&#xff0c;绘图基础&#xff0c;基本图形的绘制&#xff0c;画笔画刷的使用&#xff0c;文本绘制&#xff0c;以及文本字体的更改。 文章目录 一.绘图基础1.BeginPaint函数2.EndPaint函数3.颜色的使用 二…

8 集群管理

8 集群管理 8.1 集群结构 ES通常以集群方式工作&#xff0c;这样做不仅能够提高 ES的搜索能力还可以处理大数据搜索的能力&#xff0c;同时也增加了系统的容错能力及高可用&#xff0c;ES可以实现PB级数据的搜索。 下图是ES集群结构的示意图&#xff1a; 从上图总结以下概念…

SSM整合详细教学(下)

SSM整合详细教学&#xff08;下&#xff09; 五、SSM整合页面开发1 准备工作2 列表查询功能3 添加功能4 修改功能5 删除功能 六、拦截器1 拦截器简介问题导入1.1 拦截器概念和作用1.2 拦截器和过滤器的区别 2 入门案例问题导入2.1 拦截器代码实现【第一步】定义拦截器【第二步】…

从零开始搭建高效的文件服务器:FastDFS与Nginx完美结合,内网穿透实现公网访问

目录 前言 1. 本地搭建FastDFS文件系统 1.1 环境安装 1.2 安装libfastcommon 1.3 安装FastDFS 1.4 配置Tracker 1.5 配置Storage 1.6 测试上传下载 1.7 与Nginx整合 1.8 安装Nginx 1.9 配置Nginx 2. 局域网测试访问FastDFS 3. 安装cpolar内网穿透 4. 配置公网访问…

区间预测 | MATLAB实现QRBiLSTM双向长短期记忆神经网络分位数回归时间序列区间预测

区间预测 | MATLAB实现QRBiLSTM双向长短期记忆神经网络分位数回归时间序列区间预测 目录 区间预测 | MATLAB实现QRBiLSTM双向长短期记忆神经网络分位数回归时间序列区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 进阶版 基础版 基本介绍 MATLAB实现QRBiLS…

C语言介绍

C语言的简洁 C语言仅有32个关键字、9种控制语句、34种运算符即可实现无数的功能。 关键字 可省略的关键字&#xff1a;auto、extern、signed. 复合类型的关键字&#xff1a;enum、struct、union. include include表示导入&#xff0c;include可以导入任意的文件。 比如#in…

Windows消息,消息循环的处理,消息队列,键盘消息,鼠标消息,定时器消息

上一章节中我们带大家编写了第一个Windows程序&#xff0c;并且带大家学习了注册窗口&#xff0c;创建窗口&#xff0c;这一章中我们来学习Windows消息&#xff0c;学习对消息循环处理的原理&#xff0c;并且带领大家学习一些常见的消息。 文章目录 一.消息基础1.消息概念及其作…

AOF 持久化详解

文章目录 AOF 相关配置AOF 文件的修复AOF 文件格式RESP 协议查看 AOF 文件清单文件 AOF RewriteRewrite 策略手动Rewrite自动Rewrite AOF 持久化过程AOF优缺点AOF与RDB混合持久化 AOF (Append Only File) 是把所有对内存进行修改的指令&#xff08;写操作&#xff09;以独立日志…

《花雕学AI》用AI创造清晨的美好:ChatGPT+DALL-E 2 生成“早上好”的场景图

早晨是一天中最美好的时刻&#xff0c;也是最适合与AI对话的时刻。想象一下&#xff0c;当你醒来&#xff0c;打开手机&#xff0c;就能看到一个AI为你生成的“早上好”的场景图&#xff0c;是不是很温馨&#xff1f;这就是ChatGPTDALL-E 2&#xff08;新Bing&#xff09; 的魅…

Elevate:全世界最小的介入泵,融资五千万美金

近日&#xff0c;以色列医疗器械公司Magenta Medical宣布完成5500万美元的C轮融资&#xff0c;该公司主要产品Elevate是目前全球最小的心脏介入泵&#xff0c;主要用于治疗急性心力衰竭患者和高危PCI的辅助。该泵采用了创新的设计和材料&#xff0c;可以通过桡动脉插入&#xf…

哪款远程控制软件可以远程玩游戏?

远程控制软件可以让你在不同设备之间进行远程控制。许多人可能会想知道&#xff0c;哪款远程控制软件可以在远程玩游戏时享受更好的游戏体验。 首先&#xff0c;在寻找适合远程游戏的远程控制软件之前&#xff0c;我们需要知道什么是远程游戏和远程控制。 远程游戏是一种允许玩…

第十二章_Redis单线程 VS 多线程

Redis为什么选择单线程&#xff1f; 是什么 这种问法其实并不严谨&#xff0c;为啥这么说呢? Redis的版本很多3.x、4.x、6.x&#xff0c;版本不同架构也是不同的&#xff0c;不限定版本问是否单线程也不太严谨。 1 版本3.x &#xff0c;最早版本&#xff0c;也就是大家口口相…

一文读懂 DNS 解析

导读 文章为“一文读懂域名与网站系列”第二篇&#xff0c;上篇文章主要介绍了域名的注册、建站和管理&#xff0c;通过本文你可以了解以下几个问题&#xff1a; 域名的结构、常用解析记录的类型 DNS 解析的过程 DNS 解析拓展知识 众所周知&#xff0c;互联网中的地址其实是…

想让行车记录仪协助道路病害自动化检测?可以!

针对【RGB3DS道路表观病害信息智慧检测系统】&#xff0c;我们着重介绍过其与道路检测车做集成预装或者处理道路检测车数据的极大便利&#xff0c;其中之一便是可高效输出带有道路检测车桩号标记的病害报表&#xff0c;这是因为道路检测车数据本身具有规范性。 那么如果使用道…

Linux(类Unix)系统可执行程序ELF文件格式详解

我们知道一个Linux程序饱和程序代码和初始数据&#xff0c;那么这些程序二进制代码和初始数据在可执行程序文件中是怎么进行存储呢&#xff1f;这便是ELF文件格式要解决的问题。 一个Linux执行程序的内存结构粗略可划分为 代码段、数据段、BSS、堆、栈&#xff0c;如下图所示&…

Golang Gin 使用路由分类处理请求

在前面已经学习了gin框架如何处理请求&#xff0c;解析请求&#xff0c;返回数据。 在实际的项目当中&#xff0c;项目往往是以模块化来进行划分和开发的&#xff0c;所谓的模块化就是按照功能来划分&#xff0c;比如会有产品模块&#xff0c;会有用户模块&#xff0c;会将用户…

如何用ChatGPT协助搭建品牌视觉体系(VI)?

该场景对应的关键词库&#xff08;18个&#xff09;&#xff1a; VI体系、品牌、目标市场、品牌DNA、人群特征、设计理念、标志设计、配色方案、字体选择、图形元素、价值观、形象、客户经理、需求、品牌定位、目标受众、主色调、辅助色 提问模板&#xff08;2个&#xff09;&…

并发编程09:ThreadLocal

文章目录 9.1 ThreadLocal简介9.1.1 面试题9.1.2 是什么&#xff1f;9.1.3 能干吗&#xff1f;9.1.4 API介绍9.1.5 永远的helloworld讲起9.1.6 总结 9.2 ThreadLocal源码分析9.2.1 源码解读9.2.2 Thread、ThreadLocal、ThreadLocalMap关系9.2.3 总结 9.3 ThreadLocal内存泄漏问…

基于html+css的图展示53

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…