数据结构补强——图

图基础

图的定义

图G顶点集V边集E组成,记为G = (V,E),其中V(G)表示图G中顶点的有限非空集;E(G)表示图G中顶点之间的关系(边)集合。若V = {v1,v2,…,vn},则用|V|表示图G中顶点的个数,也称为图G的阶,E = { {u,v} | u∈V,v∈V},用|E|表示图G中边的条数
注意:线性表可以是空表,树可以是空树,但图不可以是空,即V一定是非空集
在这里插入图片描述

无向图、有向图

若E是无向边(简称)的有限集合时,则图G为无向图。边是顶点的无序对,记为(v,w)或(w,v),因为(v,w)=(w,v),其中v、w是顶点。可以说顶点w和顶点v互为邻接点,边(v,w)依附于顶点w和v,或者说边(v,w)和顶点v、w相关联

若E是有向边(也称)的有限集合时,则图G为有向图。弧是顶点的有序对,记为<v,w>,其中v、w是顶点,v称为弧尾,w称为弧头。<v,w>称为从顶点v到顶点w的弧,也称v邻接到w,或w邻接自v。<v,w> != <w,v>

简单图、多重图

在这里插入图片描述

顶点的度、入度、出度

在这里插入图片描述

顶点-顶点的关系描述

在这里插入图片描述

连通图、强连通图

在这里插入图片描述
连通图最少有n-1条边是因为n个节点两两相连
非连通图最多有的情况是当其他n-1个节点两两相连,而最后一个节点一个都不连

子图

在这里插入图片描述
生成子图是拥有原图所有点的子图

连通分量

用于描述无向图
在这里插入图片描述

强连通分量

用于描述有向图
在这里插入图片描述

生成树

n个顶点有n-1条边,再多就会形成回路
在这里插入图片描述

生成森林

在这里插入图片描述

边的权、带权图/网

在这里插入图片描述

几种特殊形态的图

在这里插入图片描述

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

图的存储结构

  • 邻接矩阵:数组实现的顺序存储,空间复杂度高O(n²),不适合存储稀疏图
  • 邻接表:找有向图的入度不方便,删除顶点、删除边的时间复杂度高
  • 十字链表:存储有向图
  • 邻接多重表:存储无向图

邻接矩阵法

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

如何求顶点的度、入度、出度

在这里插入图片描述
带权图:
在这里插入图片描述

性能分析

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

邻接矩阵的性质

行*列
在这里插入图片描述

邻接表

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

十字链表法

只能用于有向图
在这里插入图片描述

性能分析

在这里插入图片描述

邻接多重表

只用于存储无向图
在这里插入图片描述

总结

在这里插入图片描述

图的操作

在这里插入图片描述

判断图中是否有某条边

无向图:
在这里插入图片描述
有向图:
在这里插入图片描述

列出图中与结点邻接的所有边

无向图:
在这里插入图片描述
有向图:
在这里插入图片描述

在图中插入顶点

在这里插入图片描述

在图中删除顶点

无向图:
在这里插入图片描述
有向图:
在这里插入图片描述

向图中添加一条边

在这里插入图片描述

求图中顶点x的第一个邻接点

无向图:
在这里插入图片描述
有向图:
在这里插入图片描述

假设图中顶点x的一个邻接点y,返回除y之外顶点x 的下一个邻接点的顶点号,若y是x的最后一个邻接点,则返回-1

无向图:
在这里插入图片描述

获取并设置图中边的权值

在这里插入图片描述

图的遍历

  • 广度优先遍历
  • 深度优先遍历

广度优先遍历

在这里插入图片描述

代码实现

在这里插入图片描述

遍历序列的可变性

在这里插入图片描述

算法改进

因为如果是非连通图,则无法遍历完所有结点
在这里插入图片描述

复杂度分析

在这里插入图片描述

广度优先生成树

在这里插入图片描述

广度优先生成森林

在这里插入图片描述

练习

在这里插入图片描述

深度优先遍历

在这里插入图片描述

算法改进

在这里插入图片描述

复杂度分析

空间复杂度:
在这里插入图片描述
时间复杂度:
在这里插入图片描述

深度优先生成树

在这里插入图片描述

深度优先生成森林

在这里插入图片描述

图的遍历和图的连通性

无向图:
在这里插入图片描述
有向图:
在这里插入图片描述

总结

在这里插入图片描述

图的最小生成树(MST)

概念

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

Prim算法(普里姆)

在这里插入图片描述

Kruskal算法(克鲁斯卡尔)

在这里插入图片描述

两种算法对比

在这里插入图片描述

Prim算法的实现思想

在这里插入图片描述

Kruskal算法的实现思想

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

图的最短路径问题

在这里插入图片描述

BFS求无权图的单源最短路径

BFS实际上的结果就是单源最短路径
缺点:只能用于不带权的图

代码实现

在这里插入图片描述

在这里插入图片描述

Dijkstra(迪杰斯特拉)算法

在这里插入图片描述

步骤

  • 初始:
    在这里插入图片描述
  • 第一轮:
    在这里插入图片描述
  • 第二轮:
    在这里插入图片描述
  • 第三轮:
    在这里插入图片描述
  • 第四轮:
    在这里插入图片描述

如何使用数组信息

在这里插入图片描述

时间复杂度

在这里插入图片描述

对比Prim算法的实现思想

在这里插入图片描述

用于负权值带权图

在这里插入图片描述

Floyd算法

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

步骤

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

在这里插入图片描述

在这里插入图片描述

练习

在这里插入图片描述

不能解决的问题

在这里插入图片描述

总结

在这里插入图片描述

有向无环图描述表达式

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

拓扑排序

AOV网

在这里插入图片描述

概念

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

代码实现

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

逆拓扑排序

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

关键路径

AOE网

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

概念

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

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

求所有事件的最早发生时间

在这里插入图片描述

求所有事件的最迟发生时间

在这里插入图片描述

求所有活动的最早发生时间

在这里插入图片描述

求所有活动的最迟发生时间

在这里插入图片描述

求所有活动的时间余量

在这里插入图片描述

求得关键活动、关键路径

在这里插入图片描述

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

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

猜你喜欢

转载自blog.csdn.net/upset_poor/article/details/123315379