数据结构——第六章:图

目录

1、图

2、图的存储

3、图的遍历

4、最小生成树

5、最短路径

6、拓扑排序


1、图

1、图的基本概念:

  • 有向图用<a,b>表示,无向图用(a,b)表示。
  • 简单图:不存在重边、不存在顶点到自身的边。
  • 简单路径:顶点不重复出现的路径。(除去第一个和最后一个顶点其余顶点不重复出现的回路叫简单回路)
  • 完全图:任意两个顶点均有边存在(完全图一定是连通图)(有向图n(n-1)条边,无向图n(n-1)/2条边)。

2、联通图与连通分量:(找图中有多少连通分量???)

  • 连通图:无向图中任意两点都是连通的。
  • 连通分量(对于非连通图来说的):无向图的极大连通子图。
  • 极小连通子图(生成树):若n个点则只有n-1个边。(多加一个就生成环,少加一个边就不连通)
  • 强连通分量和强连通图是指有向图。
  • 强连通分量个数:①找入度和出度为0的点,依次删除该点和相对应的边,直到没有入度和出度为0的点。②删除掉的所有顶点数加上最后一个连通图。

3、顶点的度:所有顶点的度(顶点a的度:某一个顶点的度)

4、n个顶点,保证连通最少要多少边:n-1个顶点组成完全图再加最后一个顶点。

2、图的存储

1、邻接矩阵:

  • 稠密图适用邻接矩阵,复杂度O(n*n),邻接矩阵表示法唯一,邻接表不唯一。
  • 二维数组的n次方:图中两个点长度为n的路径个数。

2、邻接表:

  • 结合顺序存储和链式存储,节省空间避免浪费。稀疏图适用于邻接表。
  • 删除某个点相关的所有边:入度和出度,遍历整个表,O(n+e)。
  • 顶点在边表出现的次数:该顶点的入度。
  • 无向图存储空间O(n+2e),因为每条边遍历两次,有向图存储空间O(n+e)

3、十字链表:

  • 十字链表:是有向图的一种链式存储结构。
  • 步骤:先画邻接表,再一次从前往后找后面存储的第二位数字与其相同的,并指向它。

4、邻接多种表:

  • 是无向图的一种链式存储结构。

3、图的遍历

1、时间复杂度和空间复杂度:

  • **邻接表:****BFS和DFS时间均为O(n+e),空间复杂度均为O(n),**需要借用一个数组进行标记,故为O(n)。
  • **邻接矩阵:****BFS和DFS时间均为O(n*n),空间也均为O(n*n),**二维数组故为O(n*n)
  • 图的遍历不一定必须是连通图,非连通图需要调用两次或两次以上的遍历算法
  • BFS借用队列,放入队列中,依此进依次出。

4、最小生成树

1、生成树的定义:

  • 生成树、深度优先生成树、广度优先生成树、最小生成树。
  • Kruskal、Prim算法

2、最小生成树:

  • 有权值相同的边,最小生成树****可能不唯一;只要没有权值相同的边,则最小生成树一定唯一。
  • 大题唯一不唯一:只要最小的边都被选了。且最后一个或几个加入的边只有这一种选择,则唯一。(因为加入其他的边就重合)(大部分是的,具体的具体分析)
  • 最小生成树虽可能不唯一,但权值最小唯一,边值也唯一(点数减一),且无法保证任意两点之间是最短路径。

3、Kruskal算法:

  • **围绕边进行选择,**对边进行权值排序,依次判别加入。
  • 不依赖顶点V,边排序O(elge)。(适用于边稀疏但顶点多)

4、Prim算法:

  • 围绕顶点进行选择。(任选一点加入集合,依次找其最近的邻居)
  • 不依赖于边E,适合边稠密的图,时间O(v*v)

5、最短路径

1、BFS算法:

  • 单源最短路径:从一个顶点到其余各顶点的最短路径。
  • 只适合于无权图。时间复杂度O(v*v)或O(v+e)。

2、Dijkstra算法:基于贪心策略

  • 单源最短路径:从一个顶点到其余各顶点的最短路径。(画图找最小千万不要大意)
  • 若求每对顶点最短路径,则O(n^3)
  • 只适合无权图、有权图(不适合负权值的图)时间O(n*2)

3、Floyd算法:

  • 求各顶点之间的最短路径
  • 适用于无权图、有权图、负权值的图。时间O(n*n*n)

4、判别有环:

  • 深度优先搜索

  • 广度优先搜索

  • 关键路径

  • 并查集:
    1、有向无环图描述表达式:

  • 先将运算符的运算顺序在下面依次标记

  • 然后将字母不重复地依次排开(不能出现重复的操作数顶点)

  • 最后按照运算符顺序进行有向箭头连接

6、拓扑排序

1、拓扑排序性质:

  • 强连通图不能进行拓扑排序。
  • <a,b>表示活动a先于b活动进行,即不存在b到a边。
  • 即使拓扑排序唯一,也无法确定该图(仅唯一但可能有多个指向)
  • 若一个顶点有多个直接后继,则拓扑排序不唯一。

2、拓扑排序:

  • 先选择一个没有前驱的顶点,输出它
  • 再删除该顶点以及从该顶点出发的边(然后重复前两步)

3、逆拓扑排序:

  • 先选择一个没有后继的顶点,输出它
  • 再删除该顶点以及从到达该顶点的边(然后重复前两步)

4、关键路径:具有最大路径长度的路径

  • 关键路径是以拓扑排序为基础的。
  • 最迟时间:弧指向的顶点的时间减去弧所持续的时间。
  • 只有当所有关键路径同时减少时才能缩短工期
相关推荐
LuminousCPP11 分钟前
数据结构-排序(一):基础排序算法横向对比|冒泡、插入、希尔、堆与双向选择,详解二分 / Knuth 增量
c语言·数据结构·笔记·算法·排序算法
柳鲲鹏1 小时前
股票打新,中签为什么难?
笔记
亮工硬件1 小时前
1-8 简易串口通讯协议(UART + 自定义帧协议)
笔记·stm32·单片机·嵌入式硬件·学习
青山木1 小时前
Hot 100 --- 买卖股票的最佳时机
java·数据结构·算法·leetcode·贪心算法
志尊宝1 小时前
Vue3 零基础每日笔记(004):模板语法初识——插值表达式、v-bind、v-on 一次学会
javascript·vue.js·笔记
SatanII2 小时前
OpenStack核心组件详解|Keystone+Glance+Nova+Cinder原理与实操笔记
网络·笔记·openstack
csdn_aspnet2 小时前
C++ 未排序数组中第 k 个最小/最大元素 | 最坏情况下的线性时间
数据结构·c++·算法
点心的游戏开发世界11 小时前
GDScript 入门笔记(十一):Lambda 与匿名函数
开发语言·笔记·游戏引擎·godot
摇滚侠11 小时前
《SpringBoot 3:入门与应用实战》第 12 章 JDBC 与事务 使用 JdbcTemplate 阅读笔记 32
spring boot·笔记·后端
aqiu11111111 小时前
【LeetCode 902】最大为 N 的数字组合 - 详细题解与数位组合思路
数据结构·算法·leetcode·蓝桥杯·数位dp