数据结构——第六章:图

目录

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、关键路径:具有最大路径长度的路径

  • 关键路径是以拓扑排序为基础的。
  • 最迟时间:弧指向的顶点的时间减去弧所持续的时间。
  • 只有当所有关键路径同时减少时才能缩短工期
相关推荐
sakabu44 分钟前
Linux安装MySQL数据库并使用C语言进行数据库开发
linux·c语言·数据库·笔记·mysql·数据库开发
我想吃余1 小时前
【初探数据结构】二叉树的顺序结构——堆的实现详解(上下调整算法的时间复杂度分析)
数据结构·算法
Phoebe鑫1 小时前
数据结构每日一题day2(顺序表)★★★★★
数据结构·算法·leetcode
lwewan2 小时前
26考研——图_图的代码实操(6)
数据结构·笔记·考研·算法·深度优先
aimmon2 小时前
Rust从入门到精通之入门篇:8.基本数据结构
开发语言·数据结构·rust
程序员Linc3 小时前
《数字图像处理》第三章 3.8 基于模糊技术的图像强度变换与空间滤波学习笔记
笔记·学习·数字图像处理·模糊技术·强度变换·空间滤波
十五年专注C++开发3 小时前
双指针技巧在C++中的应用:从基础到进阶
开发语言·数据结构·c++
vv啊vv4 小时前
使用android studio 开发app笔记
android·笔记·android studio
王RuaRua4 小时前
[数据结构]1.时间复杂度和空间复杂度
c语言·数据结构·算法