数据结构——图论详细笔记

一 图论基本概念

 

 

 

Directed Acyclic Graph (DAG)

 

二 图的存储

 ①邻接矩阵(适用于稠密图)

 ②邻接表(适用于稀疏图)

 

三、图的遍历 

①深度优先搜索


//(基于邻接表实现,以有向图为例)
//DFS:Depth First Search 深度优先搜索
//1、访问起始顶点  2、访问一个未访问过的邻接顶点 3、若所有邻接顶点都已被访问,则回溯 4、所有顶点都被访问,遍历结束
void dfs(int start, bool visited[])
{//访问起始结点cout << verList[start].ver << '\t';visited[start] = true;//找到顶点表中该顶点对应的链表edgeNode* node = verList[start].head;while (node){if (!visited[node]) dfs(visited[node],visited); //访问未访问过的邻接结点node = node->next; //跳过已访问的结点}//当所有邻接结点都已被访问,则回溯
}  //递归函数结束时,生成一棵深度优先搜索树void dfs()
{//访问标志数组初始化bool* visited=new bool[Vers];  //Vers:顶点数量for (int i = 0; i < Vers; i++)Vers[i] = false;for (int i = 0; i < Vers; i++){if (visited[i] == true) continue; //寻找下一个树遍历的起始结点dfs(i, visited);} //生成深度优先搜索森林(起点选择不同,生成结果不同,有些情况能只生成一棵树)
}

DFS将所有边和顶点遍历一次,若采用邻接数组,时间复杂度为O(V²),若采用邻接矩阵,时间复杂度为O(V+E)。

②广度优先搜索


//BFS:Breadth First Search 广度优先搜索
//1、访问起始顶点 2、依次访问起始顶点的所有未访问的邻接结点  3、所有顶点都被访问,遍历结束
void bfs()
{queue<int>  q;bool* visited = new bool[Vers];for (int i = 0; i < Vers; i++)visited[i] = false;for (int i = 0; i < Vers; i++){if (visited[Vers] == true)  continue;  ///寻找一棵新的搜索树的起始结点q.push(i);  //结点入队,开始一棵搜索树的生成while (!q.empty()){int currentNode = q.front();q.pop();if (visited[currentNode])  continue; //这里需要注意,比如1的邻接结点2、3入队,而3邻接于2,在访问3的过程中已访问了2,所以2出队时无需再次访问cout << verList[currentNode].ver << '\t'; //访问当前结点visited[currentNode] = true;//找到顶点表中该顶点对应的链表edgeNode* node = verList[currentNode].head;//将未访问的邻接顶点入队while (node){if (!visited[node->end]) q.push(node->end); //将未访问的邻接顶点入队node = node->next;}  }}
}

 

可用优先级队列实现。

BFS将所有边和顶点遍历一次,若采用邻接数组,时间复杂度为O(V²),若采用邻接矩阵,时间复杂度为O(V+E)。 

四、图的应用

1、欧拉路径(一笔画问题) 

欧拉路径:在图中找到一条路径经过每一条边,且每条边只经过一次

欧拉回路:起点和终点相同的欧拉路径

2、图的连通性

①无向图的连通性

②有向图的连通性(Kosaraju算法)

G图和Gr图分别进行一次dfs,时间复杂度为O(V+E)

3、拓扑排序

能进行拓扑排序的图是有向无环图(DAG),顶点表示活动的图称为AOV网((activity on the vertex)

 

 

4、关键路径

AOE(activity on the edge)网是另一种有向无环图,有向边的权值表示活动的持续时间,弧尾表示活动的起点,弧头表示活动的终点,边的方向表示事件发生的先后顺序。可以用AOE网表示一项工程,如下图A为工程的源点,G为工程的收点。关键路径具有从源点到收点的最长路径长度,其上的活动称为关键活动。

顶点x的最早发生时间为ee(x),最晚发生时间为le(x),定义le(x)-ee(x)=△e(x)为时间余量,满足△e(x)=0的顶点x为关键活动,找到所有时间余量为0的顶点即找到了关键路径。

 算法实现:

①进行拓扑排序

②按照拓扑序列,正向遍历每一个顶点x,计算最早发生时间ee(x):

所有顶点的ee初始化为0,假设边<u,v>的长度为Luv,对于每一个顶点u,检查其后继顶点v,若ee(u)+Luv>ee(v),更新ee(v)=ee(u)+Luv 。ee(G)即为工程的最短完成时间,即关键路径的长度Len.

③按照拓扑序列,逆向遍历每一个顶点x,计算最晚发生时间le(x):

所有顶点的le初始化为Len,假设边<u,v>的长度为Luv,对于每一个顶点u,检查其后继顶点v,若le(v)-Luv<le(u),更新le(u)=le(v)-Luv 。

④计算△e(x)=le(x)-ee(x),输出△e(x)=0的顶点即为关键活动,构成一条关键路径。

5、最小生成树

最小生成树:边的权值之和最小的生成树

①Kruskal算法

[选择边][优先级队列+并查集]

 

 

②Prim算法

[选择点]

 

最小生成树不一定唯一,当所有边的权值不同时,最小生成树唯一。 

6、最短路径

单源最短路径:计算从一个顶点出发,到其他每一个顶点的最短路径。算法实现的目标是得到一个顶点出发到其他顶点的最短路径,并获取路径的结构。

①非加权单源最短路径(BFS)

 

 

distance[i]:源点到顶点i的最短路径

prev[i]:最短路径中i的前驱顶点

用bfs实现(利用队列),输出使用递归 

 

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

②加权单源最短路径(Dijkstra算法)

 

 

 

 

Dijkstra算法,只适用于所有路线的权值都为正的,如果有负权值路线则算法失效,因为第一个点就不能确保是最短路径(可能存在权值总和为负数的回路)。 

③带负权值单源最短路径(SPFA)

SPFA适用于无负环图

 

 

当图中无环时可以按照拓扑排序的序列改进Dijkstra算法,使时间复杂度达到线性,算法实现类似SPFA的过程。

总结一下,Dijkstra的一般性算法适用于无负权图,时间复杂度为O(V²),使用优先级队列可以是复杂度降低到O((V+E)logV),当图无环时,采用拓扑排序+队列可以使时间复杂度降低到线性。当存在负权时,Dijkstra算法可能出错,可以采用SPFA算法,时间复杂度为O(VE)。

 ④所有顶点对之间的最短路径(Floyd算法)

①想要找到所有顶点对之间的最短路径,可以使用V次Dijkstra算法,时间复杂度达到O(V^3)或者O(V^2logV);

②第二种经典解决算法是Floyd算法,使用穷举的思想,不断更新结点对之间的最短距离。

 

 

 

 

完结撒花!!! 

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

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

相关文章

为什么要开发盲盒小程序?商家企业的盈利方向?

近几年&#xff0c;盲盒已经成为了一种娱乐消费的流行趋势&#xff0c;受到了年轻人的喜欢&#xff0c;推动了盲盒经济的快速发展。在互联网的支持下&#xff0c;盲盒行业也获得了数字化发展&#xff0c;盲盒小程序为市场创新发展提供了重要动力。在当下小程序快速发展的时代&a…

【C++修行之道】类和对象(四)运算符重载

目录 一、 运算符重载 函数重载和运算符重载有什么关系&#xff1f; 二、.*运算符的作用 三、运算符重载的正常使用 四、重载成成员函数 五、赋值运算符重载 1.赋值运算符重载格式 传值返回和引用返回 有没有办法不生成拷贝&#xff1f; 2. 赋值运算符只能重载成类的…

MongoDB CRUD操作:可重试写入

MongoDB CRUD操作&#xff1a;可重试写入 文章目录 MongoDB CRUD操作&#xff1a;可重试写入使用的先决条件部署的限制支持的存储引擎3.6 MongoDB 驱动程序MongoDB 版本写确认 可重试写入和多文档事务启用可重试写入MongoDB驱动mongosh 可重试的写操作行为持续的网络错误故障切…

Linux如何远程连接服务器?

远程连接服务器是当代计算机技术中一个非常重要的功能&#xff0c;在各种领域都有广泛的应用。本文将重点介绍如何使用Linux系统进行远程连接服务器操作。 SSH协议 远程连接服务器最常用的方式是使用SSH&#xff08;Secure Shell&#xff09;协议。SSH是一种网络协议&#xff…

Java常规题技术分享

一、数组排序和添加成员 设计类Student和类StudentClass。 (1) 类Student有字符串属性name、double属性grade和int属性age 有带参数的构造方法&#xff0c;可设置三个属性的值 有各个属性的置取方法 (2)类StudentClass有Student数组属性stus存放班级成员&#xff0c;有int…

「不只是框架:Django REST framework的超能力大揭秘」

想要让你的API服务像五星级餐厅一样令人难忘吗&#xff1f;今天阿佑将为你揭晓&#xff01;从基础的RESTful原则到Django REST framework的高级特性&#xff0c;我们一步步带你走进API开发的后厨&#xff0c;展示如何准备食材&#xff08;数据模型&#xff09;、调制酱料&#…

揭秘GPU技术新趋势:从虚拟化到池化

从GPU虚拟化到池化 大模型兴起加剧GPU算力需求&#xff0c;企业面临GPU资源有限且利用率不高的挑战。为打破这一瓶颈&#xff0c;实现GPU算力资源均衡与国产化替代&#xff0c;GPU算力池化成为关键。本文深入探讨GPU设备虚拟化途径、共享方案及云原生实现&#xff0c;旨在优化资…

Java EE-Spring Session实现(如何导入依赖、配置文件)

Spring Session Session 共享问题 在 Web 项目开发中&#xff0c;Session 会话管理是一个很重要的部分&#xff0c;用于存储与记录用户的状态或相关的数据。 通常情况下 session 交由容器&#xff08;tomcat&#xff09;来负责存储和管理&#xff0c;但是如果项目部署在多台…

yolov5模型结构与构建原理

一.yolov5模型结构与构建原理 修改模型结构&#xff0c;全部在models文件夹下面 models/common.py &#xff08;加入新增网络细节&#xff09; models/yolo.py &#xff08;设定网络结构传参细节&#xff09; models/##.yaml &#xff08;修改模型结构配置文…

测试文章27-这是一篇测试文章请忽略

这是一篇测试文章请忽略 这是测试的文字&#xff0c;如有打扰请谅解。稍后测试完毕会删除 ‍ ‍ 测试代码块 ‍ public static void main(String[] args){System.out.println("Hello, World!"); } aaa

kill 不管用时,类型为C

当使用nvidia-smi时看到类型为C的进程时&#xff0c;使用 kill -9 PID&#xff0c;却不管用&#xff0c;这时需要先使用如下命令&#xff0c;找出运行的脚本对应的所有PID: ps -aux | grep train.py 接着就会把train.py对应运行的进程全部展示出来&#xff1a; 接着就是使用 …

C++ 习题精选(3)——只出现一次的数字

目录 1. 只出现一次的数字 I2. 只出现一次的数字 II 1. 只出现一次的数字 I 题目描述&#xff1a;给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度&…

Go 延迟调用机制

defer延迟调用机制 是什么&#xff1f;为什么&#xff1f; 延迟调用是函数return正常结束后或者painc异常结束前会执行的一些操作。 再申请资源的时候延迟调用&#xff0c;防止忘记资源释放&#xff0c;数据库、文件、锁等资源释放。 延迟调用的顺序&#xff1f; 会按先进后出的…

景源畅信电商:抖音小店怎么做好运营?

在如今这个数字化时代&#xff0c;电商平台如雨后春笋般涌现&#xff0c;其中抖音小店以其独特的短视频营销模式迅速崛起。如何在这个竞争激烈的市场中占据一席之地&#xff0c;成为了许多商家和创业者思考的问题。下面&#xff0c;我们将深入探讨抖音小店的运营策略&#xff0…

多线程插入10万条数据,且避免堆栈溢出

在多线程环境下插入大量数据&#xff08;如10万条&#xff09;时&#xff0c;避免堆栈溢出的关键在于合理管理线程的生命周期、控制递归深度&#xff08;如果使用了递归的话&#xff09;&#xff0c;以及合理分配每个线程处理的数据量。以下是一些建议来实现这个目标&#xff1…

论文阅读[268]基于EEM荧光光谱,感知燃烧产生的颗粒物

【论文基本信息】 标题:EEM Fluorescence Spectroscopy based Sensing of Combustion Generated Particulate Matter 来源与类型:华盛顿大学,博士学位论文 推荐理由:论文作者将主成分回归(PCR)方法与三维荧光光谱结合,预测样本中特定类污染物的总浓度,准确率达到了97.6…

Qt——控件

目录 概念 QWidget核心属性 enabled geometry WindowFrame的影响 windowTitle windowIcon qrc的使用 windowOpacity cursor font toolTip focusPolicy ​编辑 styleSheet 按钮类控件 PushButton RadioButton CheckBox 显示类控件 Label textFormat pixm…

docker run 两个挂载路径怎么设置

docker run 两个挂载路径怎么设置 在使用 docker run 命令时&#xff0c;如果需要挂载多个宿主机目录到容器中&#xff0c;您只需为每个挂载路径添加一个 -v 或 --volume 选项即可。下面是一个示例&#xff0c;展示了如何挂载两个宿主机目录到容器的不同路径上&#xff1a; Bas…

MongoDB CRUD操作:地理位置应用——通过地理空间查询查找餐厅

MongoDB CRUD操作&#xff1a;地理位置应用——通过地理空间查询查找餐厅 文章目录 MongoDB CRUD操作&#xff1a;地理位置应用——通过地理空间查询查找餐厅地图的扭曲搜索餐厅浏览数据查找当前邻居查找附近所有餐厅查找一定距离内的餐厅使用$geoWithin&#xff0c;不排序使用…

redhat遇到安装包缺失问题

缺失的文件用repoquery --nvr --whatprovides XXX 查询 repoquery --nvr --whatprovides libstdc.so.6然后使用yum -y install XXX 选择查询到的文件的安装 yum -y install libstdc-8.5.0-3.el8Last metadata expiration check: 0:06:30 ago on Wed Jun 5 04:02:24 2024. lib…