数据结构万字总结(超级详细)第六章——图

定义

基本概念

顶点的度

对无向图: 顶点v的度是指依附于该顶点的边的条数,度数之和等于边数乘以2。

对有向图:入度是以顶点v为终点的有向边的数目

出度是以顶点v为起点的有向边的数目

顶点v的度等于其入度和出度之和

出度

入度

路径

顶点v0到vn之间的一条路径是指顶点序列:v0,v1,v2...vn(包含起点和终点)

回路(又叫环)

第一个顶点和最后一个顶点相同的路径称为回路或环

简单路径

在路径序列中,顶点不重复出现的路径称为简单路径

简单回路

除第一个顶点和最后一个顶点外,其余顶点不重复出现的回路称为简单回路

路径长度

路径上边的数目,注意这里和树结点的路径长度类似,树节点的路径长度时从跟结点到叶子结点的边数

点到点的距离

从顶点u出发到顶点v的最短路径存在,则此路径的长度称为从u到v的距离,若从u到v根本不存在路径,则记该距离为无穷

连通图(对无向图)

若图G中任意两个顶点都是连通的,则称图G为连通图,否则称为非连通图

若G是连通图,则最少有n-1条边, 若G是非连通图,则最多可能有C(n-1,2)条边,C(n-1,2)是组合公式。(即n-1个顶点是完全图,剩余一个顶点是孤立的)

强连通图(对有向图)

若图中任何一对顶点都是强连通的,则称此图为强连通图

对于n个顶点的有向图G, 若G是强连通图,则最少有n条边(形成回路)

子图

即子图顶点是原图顶点的子集,子图的边是原图边集的子集

  • 生成子图

    生成子图的顶点个数和原图个数一样,但是边是原图边集合的子集

 

连通分量(对无向图)

无向图中的极大连通子图称为连通分量 子图必须连通,且包含尽可能多的顶点和边 注意:连通分量和强连通分量本质就是一个子图,只是这个子图是极大的,即尽可能包含更多的顶点和边

 

强连通分量(对有向图)

有向图中的极大强连通子图称为有向图的强连通分量

子图必须强连通,同时保留尽可能多的边

 

极小连通子图(就是生成树)

若图中顶点数为n,则它的生成树含有n-1条边。对生成树而言,若砍去它的一条边,则会变成非连通图,若加上一条边则会形成一个回路。 极小连通子图包含所有顶点,并且边数是最少的连通子图

生成树

连通图的生成树是包含图中全部顶点的一个极小连通子图,若图中顶点数为n,则它的生成树含有n-1条边,

  • 特征

    对生成树而言,若砍去它的一条边,则会变成非连通图,若加上一条边则会形成一个回路

 

生成森林

非连通图中,连通分量的生成树构成了非连通图的生成森林

 

边的权

在一个图中,每条边都可以标上具有某种含义的数值,改数值称为权值

带权图

边上带有权值的图称为带权图,也称为网

带权路径长度

当图是带权图时,一条路径上所有边的权值之和,称为该路径的带权路径长度

哈夫曼树的带权路径长度:所有叶子结点到根结点的边数乘以叶子结点的权值

无向完全图

无向图中任意两个顶点之间都存在边, 若顶点树为n,则边数为(n-1)*n /2

有向完全图

有向图中任意两个顶点之间都存在方向相反的两条弧 若顶点树为n,则边数为(n-1)*n

总结:连通分量就是极大连通子图,生成树就是极小连通子图

种类

简单图

1、不存在重复边

2、不存在顶点到自身的边

多重图

图G中某两个结点之间的边数多于一条,又允许顶点通过同一条边和自己关联

有向图

若E是有向边(也称弧)的有限集合时,则图G为有向图

无向图

若E是无向边(简称边)的有限集合时,则图G为无向图

稀疏图

边数很少的图称为稀疏图,一般认为:|E|<|V|log|V|时,可以将G视为稀疏图

图的存储

邻接矩阵法:空间复杂度为:O(|V|^2),删除边很方便,删除顶点需要大量移动数据

适用于存储稠密图,无向图的邻接矩阵是对称矩阵,可以压缩存储。图的表示唯一

邻接表法:顺序+链式存储,空间复杂度O(|V|+2|E|),删除边或顶点都不方便。对比树的存储结构:孩子表示法

图的邻接表表示方式不唯一

十字链表:只能存储有向图,空间复杂度:O(|V|+|E|),删除边或结点很方便

简记:算你识相(算你十向)即十字链表只能存储有向图

邻接多重表:只能存储无向图,空间复杂度O(|V|+|E|),删除边或结点很方便(只能存储无向图

关键路径

AOE网

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

1、仅有一个入度为0的顶点,称为源点,它表示整个工程的开始

2、也仅有一个出度为0的顶点,称为汇点,它表示整个工程的结束

定义

从源点到到汇点的有向路径可能有多条,所有路径中,具有最大长度路径称为关键路径,而把关键路径上的活动称为关键活动

求解方法

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

2、求所有事件的最迟发生事件

3、求所有活动的最早发生事件

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

5、求所有活动的时间剩余量

简记:一大早忙前忙后,一小晚都在忙后前 一大早:max()操作,求最早发生时间,从左往右计算

一小晚:min()操作,求最晚发生时间,从右往左计算

最晚时间-最早时间  == 可以延期的时间

特性

1、若关键活动耗时增加,则整个工程的工期将增长

2、缩短关键活动的时间,可以缩短整个工程的工期

3、当缩短到一定程度时,关键活动可能会变成非关键活动

4、可能有多条关键路径,只提高一条关键路径上的活动速度并不能缩短整个工程的工期,只有加快那些包括在所有关键活动才能达到缩短工期的目的

拓扑排序

定义

在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑序列:

1、每个顶点出现且只出现一次

2、若顶点A在序列中排在顶点B的前面,则在图中不存在从顶点B到顶点A的路径

思想

1、从AOV网中选择一个没有后继(入度为0)的顶点并输出

2、从网中删除该顶点和所有以它为终点的有向边

3、重复1和2直到当前的AOV网为空

AOV网

AOV网一定是DAG图,不能有环

性质

  • 拓扑排序、逆拓扑排序可能都不唯一

  • 若图中有环,则不存在拓扑排序或者逆拓扑排序

简记:Vivo排序(即AOV网用来拓扑排序,则剩下的AOE网用来求关键路径)

有向无环图(DAG图)表达式

最短路径

单源最短路径

  • BFS算法

    • 思想

    • 缺点:只适用于无权图或者说只适用于所有边权值都相同的图。无权图可以视为一种特殊的带权图,只是每条边的权值都为1

  • Dijkstra算法

    • 思想

      以下是Dijkstra算法的核心思想和步骤:

      初始化:将所有顶点分为两组,一组是已经求出最短路径的顶点集合,初始时只包含起点;另一组是尚未确定最短路径的顶点集合,初始时包含除起点外的所有顶点。

      选取最小距离顶点:从未确定最短路径的顶点集合中,选出距离起点最近的顶点 更新邻接点距离:以这个选出的顶点为中介,更新其邻接点到起点的距离。如果通过该顶点到达邻接点的距离小于当前记录的距离,则进行更新。(该算法的核心)

      重复过程:将新确定的最短路径顶点移动到已确定最短路径的集合中,重复步骤2和3,直到所有顶点的最短路径都被确定下来。

    • 缺点

      不适用于带有负权值的带权图

各顶点之间的最短路径

  • Floyd算法

    • 思想

      使用动态规划思想,将问题的求解分为多个阶段

    • 优点

      Floyd算法可以用于负权值带权图

    • 缺点

      不能解决带有负权回路的图,这种图有可能没有最短路径

    • 复杂度:O(|V|^3)

最小生成树

普里姆算法:Prim

  • 思想

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

  • 特点:得到的最小生成树可能不唯一

  • 复杂度

    O(|V|^2),适用于边稠密度图

  • 适合边稠密图。简记:网络普及很稠密,密密麻麻的(即普及表示普利姆算法,密密麻麻表示稠密图)

克鲁斯卡尔算法:Kruskal

  • 思想

    每次选择一条权值最小的边,使这条边的两头连通(原本连通的就不选),直到所有结点都连通

  • 特点:克鲁斯卡尔算法由于全局排序的特性,在没有相同权值的边的情况下,得到的最小生成树是唯一的

  • 复杂度

    O(|E| log2||E|),适合用于边稀疏图

  • 适合边稀疏图。简记:克鲁稀(克表示克鲁斯卡尔算法,稀表示适用稀疏图)

图的遍历

广度优先遍历

  • 思想:类似于树的层序遍历

  • 借助队列实现(树的层序遍历也要借助队列)

  • 时间复杂度

    • 邻接矩阵:O(|V|)+O(|V|^2)

    • 邻接表:O(|V|+|E|)

 

深度优先遍历

  • 思想:类似与树的先跟遍历

    树的深度优先遍历(先根、后根):从根节点出发,能往更深处走就尽量往深处走。每当访问一个结点的时候,要检查是否还有与当前结点相邻的且没有被访问过的结点,如果有的话就往下一层钻。 图的深度优先遍历类似于树的先根遍历。

  • 借助栈来实现

  • 时间复杂度

    • 邻接矩阵:O(|V|)+O(||V|^2)

    • 邻接表:O(|V|+|E|)

 

图的存储结构不同,图的遍历序列、生成树有区别:

同一个图的邻接矩阵表示方式唯一,因此广度优先遍历序列唯一,广度优先生成树唯一;

同一个图邻接表表示方式不唯一,因此广度优先遍历序列不唯一,广度优先生成树不唯一

研究生复试真题:

AOV网和AOE的区别:

答案:

  1. AOV网中,活动由顶点来表示,而AOE网中,活动是通过有向边来表示的。
  2. 时间表示:在AOV网中,边用来表示活动间的优先关系,通常不附带权重。而在AOE网中,边上的权重代表活动持续的时间,即完成该活动所需的时间长度。
  3. AOV网用来拓扑排序,AOE网用来求关键路径
  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值