一、图的基本概念
1.有向图
图中顶点到另一个顶点的方向是确定的。
2.无向图
图中顶点到另一个顶点的方向是不确定的。
3.简单图 vs 多重图
简单图:图中不存在重复边、不存在顶点到自身的边。
多重图:图中两个顶点之间的边数大于1条,允许顶点通过一条边和自身关联
4.完全图
对无向图而言,图中任意顶点之间都存在边。
对有向图而言,图中任意顶点之间都存在方向相反的两条弧。
5.子图
图B里面的边和定点之间的关系为图A的子集,则说图B为图A的子图。
图B里面的边和定点之间的关系为图A的边和定点之间的关系,则说图B为图A的生成子图。
6.连通、连通图和连通分量(无向图)
连通:定点v到定点w有路径存在,则称v和w是连通的。
连通图:图中任意两个顶点之间都是连通的;反之称为非连通图。
连通分量:无向图中的极大连通子图。
7.强联通图、强联通分量(有向图)
强联通:同上
强联通图:同上
强联通分量:同上
8.生成树、生成森林
生成树:要求包含图中的全部的n个顶点,且边的个数为n-1。
生成森林:连通分量构成的生成树。
9.顶点的度、入度和出度
无向图中,顶点的度指的是依附于顶点v的边的条数。无向图中全部顶点的度之和等于边数的2倍。
有向图中,顶点的度为入度和出度之和(等于边数)。
10.边的权和网
权值:图中每条边上具有某种含义的数值。
网:带有权值的图。
11.稠密图、稀疏图
稀疏图:变数很少的图;反之为稠密图
12.路径、路径长度和回路
路径:一个顶点到另一个顶点之间图中经过的顶点序列。
路径长度:路径上的边的数目。
回路或环:第一个顶点和最后一个顶点有相同的路径。
13.简单路径、简单回路
简单路径:顶点不重复出现的路径称为简单路径。
简单回路:除第一个顶点和最后一个顶点外,其余顶点不重复出现的回路。
14.距离
距离:两个顶点之间的路径长度。如果两个顶点之间不存在路径,则记该距离为无穷(∞)15.有向树
有向树:树中的一个顶点的入度为0,其余顶点的入度均为1。
二、图的存储及基本操作
图的存储要准确地反映顶点集和边集的信息
1.邻接矩阵法
用一个二维数组存储图中顶点与顶点之间的邻接关系。
note:
1.当邻接矩阵的元素仅表示相应边是否存在时,二维数组里面的值可用0、1表示。
2.无向图的邻接矩阵是对称矩阵,对规模特大的临接矩阵可采用压缩存储。
3.邻接矩阵表示法的空间复杂度为O(n*n)。
缺陷分析:
1.空间复杂度高:O(V*V)
2.计算度/出度/入度,必须要遍历对应行或列。
3.找相邻的边时,必须要遍历对应行或列。
2.邻接表法
.当图为稀疏图时,使用临接矩阵显然会浪费大量的存储空间,而图的邻接表法结合了顺序存储和链式存储方法,大大减少了这种不必要的浪费。
思想:
对图中每个顶点建立一个单链表,这是一个顶点表,采用顺序存储结构。
顶点表中的指针指向与顶点直接相连的边表结点。
缺陷分析:
1.空间复杂度: 无向图O(V+2E) 有向图O(V+E)。
2.计算度/出度/入度,计算有向图的度、入度不方便,其余很方便。
3.找相邻的边时,找有向图的入边不方便,其余很方便。
3.十字链表(存有向图)
有向图的一种链式存储结构。
有向图中,每个顶点用一个顶点结点表示,每条弧用一个弧结点来表示。
顶点结点:
data:存放该顶点的数据信息。firstin:指向该顶点为弧头的第一个弧结点。
firstout:指向以该顶点为弧尾的第一个弧结点。
弧结点:(有几个弧就有几个弧结点)tailvex、headvex:分别指向弧尾和弧头这两个结点的编号。
hlink:指向弧头相同的下一个弧结点。
tlink:指向弧尾相同的下一个弧结点。
info:存放该弧的相关信息。
举例讲解:
从firstIn出发,可以找到该结点的出度。从firstOut出发,可以找到该结点的入度。
名词解释:
弧头:指向方向的箭头
弧尾:指向方向的尾部
4.邻接多重表(存无向图)
举个例子:
有几条边,就有几个边结点。其中,边结点中的信息标明了这条边连接了哪两个顶点。
三、图的遍历
指从图中某一顶点出发,按照某种搜索方法沿着图中的边对图中的所有顶点有且访问一次。
图的遍历比树的遍历要复杂得多,因为图中任意一个顶点都可能和其余的顶点相邻接,所以在访问某个顶点后,可能沿着某条路径搜索又回到该顶点。为了避免同一顶点被访问多次,在整个遍历的图中,必须记录下每个已访问的顶点,可以设置一个辅助数组 visited[ ] 来标记顶点是否被访问过。
1.广度优先搜索BFS(Breadth-First-Search)
类似于二叉树的层序遍历。
算法思想:
先访问起始顶点v,再访问里这个起始顶点最近的结点(邻接节点),再从这些访问过的顶点出发,访问访问它们所有未被访问过的邻接结点,直至图中所有顶点都被访问过为止。
BFS算法性能分析:
2.深度优先搜索DFS(Depth-First-Search)
类似于树的先序遍历
基本思想:首先访问图中某一起顶点v,然后由v出发,访问与v连接且未被访问的任意一个顶点 w,再从w出发,访问与w邻接且未被访问的任意一个顶点,......重复上述步骤,当不能向下继续访问时,依次退回到被访问的顶点。若顶点v还有未被访问的邻接顶点,则从该顶点开始按照刚刚的思想,直至图中所有顶点均被访问过。
DFS算法性能分析:
3.图的遍历和图的连通性
图的遍历算法可以用来判断图的连通性。
无向图来说,则从任意结点出发,一次遍历能访问图中所有的顶点,则说明图是连通的,反之则不能。
有向图来说,从初始结点到图中的每个顶点都有路径,则能够访问到图中所有顶点。
四、图的应用
算法题考查可能性极小,更多的是结合具体案例去考查具体操作过程,必须要学会手算过程。
1.最小生成树
一个连通图的生成树包含图的所有顶点,连接顶点的边的数量要最少,增加一条边,会形成回路,减少一条边,会使树变成非连通图。
对于一个带权连通图,要求最小生成树带的权值最小(树中所有边上的权值之和)。
特点:1.若图中存在权值相同的边,则最小生成树可能不唯一。
2.最小生成树的对应的权值之和总是唯一的。
3.最小生成树的边数为顶点数减一。
求最小生成树的算法主要有Prim算法和Kruskal 算法,它们都是基于贪心算法的策略。
思想:每次加入一条边逐渐形成一颗生成树。 (P K算法)
①Prim算法(普利姆)
由顶点选权值最小的边
思想:初始时,从图中任取一顶点加入树T,然后选择一个与当前T中顶点集合距离最近的顶点,并将该顶点和相应的边加入T,每次操作后T中的顶点数和边数都加1。以此类推,直至图中所有的顶点都并入T。此时T就是最小生成树。
特点:时间复杂度:
②Kruskal算法(克鲁斯卡尔)
由权值递增的边选择顶点
思想:
初始时,先把图中的边按照权值由小到大的顺序,不断选取当前未被选取过权值最小的边且两边的顶点没有在T中的边,把依附在边上的顶点一齐加入到T中,
2.最短路径
一个顶点到其余任意一个顶点的路径上所经过边上的权值之和最小的话,就称该路径为最短路径。
问题一般分为两类:1.求某一顶点到其他各顶点的最短路径---Dijkstra
2.求每对顶点间的最短路径---Floyd
①Dijkstra(迪杰斯特拉)
算法思想:
设置一个集合S记录已求得的最短路径的顶点,初始时把源点V0放入到S,集合S每并入一个新顶点Vi,都要修改源点到其他各个已经加入S的顶点的最短路径长度值。
在构造的过程中还设置了三个辅助数组:final []: 标记个顶点是否已找到最短路径,即是否归入集合S。
dist []:记录从源点V0到其他各顶点当前的最短路径长度,它的初始值为路径上的权值,如果没值,则置dist[i] 为∞。
path []:path[i] 表示从源点到顶点i之间的最短路径的前驱结点。
②Floyd(弗洛伊德)
算法思想:
通过一个图的权值矩阵求出它的每两点间的最短路径。
递推产生一个n阶方阵序列:、、...、,其中表示的是从顶点到顶点的路径长度,k表示绕行第k个顶点的运算步骤。:表示的是最开始初始状态的图中顶点之间的权值关系。
:表示加入第n个结点后,各个结点通过加入的结点后计算出来的各对最短路径。
对于任意两个顶点,若它们之间存在边,则以此边上的权值作为它们之间的最短路径长度;若他们之间不存在有向边,则以∞作为它们之间的最短路径。每轮会增加一个中间顶点,得到的路径比原来的路径长度减少了,则以此新路径代替原路径。
举例说明:
特点:
时间复杂度:
允许图中有带负权值的边,但不允许有包含带负权值的边组成的回路。
3.有向无环图描述表达式
有项无环图:若一个有向图中不存在环,则称为有向无环图。
出题点:构建表达式的有向无环图
先将表达式用二叉树构建出来,但是发现二叉树中有许多相同的子表达式,于是可以用有项无环图去共享相同子式子的共享,从而节省存储空间。
4.拓扑排序
图的拓扑排序要求:
①图中每个顶点只出现一次
②顶点A在序列中排在顶点B的前面,则在图中不存在从B到A的路径。
5.关键路径
名词介绍
AOE网:带权有向图中,顶点表示事件,有向边表示活动,边上的权值表示完成该活动的开销(如完成活动所需要的时间),称之为用边表示活动的网络。
性质:
①只有在某顶点所代表的事件发生后,从该顶点出发的各向边所代表的活动才能开始。
②只有在进入某个顶点的各有向边所代表的活动都已结束,该顶点所代表事件才能发生。
AOV网:网中边无权值,仅表示顶点之间的前后关系。
关键路径: 从源点到汇点的所有路径中,具有最大路径长度的路径。
关键活动:关键路径上的活动。
求关键路径的算法步骤:
① 从源点出发,令源点=0,按拓扑有序求其余顶点的最早发生时间。
② 从汇点出发,按逆拓扑排序求其余各顶点的最迟发生时间。
③ 最迟发生时间-最早发生时间=0的活动构成关键路径。