1,概念
定点(Vertex)
弧(Arc)、边(Edge)
有向图、无向图
完全图:有n(n-1)/2条边的无向图。
有向完全图:有n(n-1)条弧的有向图。
入度、出度。
1)稀疏矩阵
稀疏图:有很少条边或弧的图。反之为稠密图。
①概念
矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵;与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵。
②稀疏矩阵压缩的存储方法
i>三元组
将非零元素所在的行、列以及它的值构成一个三元组(i,j,v),然后再按某种规律存储这些三元组,这种方法可以节约存储空间。但是当涉及到矩阵运算时,要大量移动元素。
ii>十字链表
十字链表表示法可以避免大量移动元素。
2)判断一个图是否有环
①判断一个有向图是否有环:
拓扑排序、深度优先遍历。
②判断一个无向图是否有环:
如果存在回路,则必存在一个子图,是一个环路。环路中所有顶点的度>=2。
算法:
第一步:删除所有度<=1的顶点及相关的边,并将另外与这些边相关的其它顶点的度减一。
第二步:将度数变为1的顶点排入队列,并从该队列中取出一个顶点重复步骤一。
如果最后还有未删除顶点,则存在环,否则没有环。
3)图的连通性
①概念
连通图:图中任意两个结点都是连通的(有相互到达的路径)。
连通分量:无向图中的极大连通子图。对于完全图,连通分量只有自身。
强连通图:任意两顶点直接存在路径的有向图(不一定直接相连)。
强连通分量:有向图中的极大强连通子图。
②应用
i>要保证在任何情况下,连通具有10个顶点的无向图,至少需要()条边。
解析:任何情况下都是连通的,考虑极端情况,即图G的9个顶点构成完全无向图,再加上一条边链接该无向图和剩余那个顶点即构成了一个连通图。因此,最少边数 = 9 × 8 / 2 + 1 = 37
考虑:若边数n小于37的时候,可以使这n条边仅连接图G中某9个顶点,从而导致第10个顶点被孤立,不连通(不满足任何情况)
ii>一个含有28条边的非连通无向图至少有多少个顶点?
用上题的思路,考察最少多少个个顶点,则考虑由一个完全图和一个顶点构成。因此完全图设需要n个节点,那么n×(n-1)/ 2 <= 28,得 n = 8,因此至少有 8 + 1 = 9个顶点。
iii>要连通具有n个顶点的有向图,至少需要()条边。(本题中连通为强连通)
n条。
2,图转换为树
对于一些特殊的图,比如只有一个顶点的图,其BFS生成树的树高和DFS生成树的树高相等。
一般的图,根据图的BFS生成树和DFS树的算法思想,BFS生成树的树高比DFS生成树的树高小。
1)深度优先遍历(DFS)
借助于一个栈来实现。
2)广度优先遍历(BFS)
借助一个队列来实现
3)应用
①4个顶点的无向完全图,一共有多少棵生成树?
4个顶点无向完全图共有6 条边,生成树有 4 - 1 = 3 条边,因此共有 C(3,6)棵生成树
②如果具有n个顶点的图是一个环,则它有多少棵生成树?
共有n条边,去掉任意一条边都是生成树,于是有n种情况。
3,图的存储结构
1)数组表示法(邻接矩阵)
两个数组:一个数组存储顶点信息;一个数组存储边(或弧)。
即邻接矩阵存储。
邻接矩阵特点:
(1)图的邻接矩阵表示是唯一的。
(2)无向图的邻接矩阵一定是一个对称矩阵(有向图不一定不对称)。因此,按照压缩存储的思想,在具体存放邻接矩阵时只需存放上(或下)三角形阵的元素即可。
(3)不带权的有向图的邻接矩阵一般来说是一个稀疏矩阵,因此,当图的顶点较多时,可以采用三元组表的方法存储邻接矩阵。
(4)对于无向图,邻接矩阵的第i行(或第i列)非零元素(或非∞元素)的个数正好是第i个顶点的度。
(5)对于有向图,邻接矩阵的第i行(或第i列)非零元素(或非∞元素)的个数正好是第i个顶点的出度(或入度)。
(6)用邻接矩阵方法存储图,很容易确定图中任意两个顶点之间是否有边相连。但是,要确定图中有多少条边,则必须按行、按列对每个元素进行检测,所花费的时间代价很大。这是用邻接矩阵存储图的局限性。
2)邻接表
图的邻接表存储方法是一种顺序分配与链式分配相结合的存储方法。
在邻接表中,对图中每个顶点建立一个单链表,第i个单链表中的节点表示依附于顶点i的边(对有向图是以顶点i为尾的边)。每个单链表上附设一个表头节点。
邻接表的特点:
(1)邻接表表示不唯一。这是因为在每个顶点对应的单链表中,各边节点的链接次序可以是任意的,取决于建立邻接表的算法以及边的输入次序。
(2)对于有n个顶点和e条边的无向图,其邻接表有n个顶点节点和2e个边节点。显然,在总的边数小于n(n-1)/2的情况下,邻接表比邻接矩阵要节省空间。
(3)对于无向图,邻接表的顶点i对应的第i个链表的边节点数目正好是顶点i的度。
(4)对于有向图,邻接表的顶点i对应的第i个链表的边节点数目仅仅是顶点i的出度。其入度为邻接表中所有adjvex域值为i的边节点数目。
(如有需要,还可以求逆邻接表来求有向图每个顶点的入度
邻接表作图的存储结构时,找邻接点所需时间是O(e),e是无向图的边或者有向图的弧的数,深度优先搜索遍历图时间复杂度为O(n+e); 拓扑排序复杂度为O(n+e)
3)十字链表
有向图的另一种链式存储结构,结合了邻接表和逆邻接表。
弧结点:对应于有向图中的弧,结点结构如下
尾域(tailvex)和头域(headvex):弧尾和弧头两个顶点在图中的位置;
链域 hlink :指向弧头相同的下一条弧;
链域 tlink :指向弧尾相同的下一条弧;
info指示与该弧相关的信息,如权重。
顶点结点:对应于有向图中的顶点,结点结构如下:
数据域(data):存储和顶点相关的信息,如顶点名称等;
firstin和firstout两链域:指示以该顶点为弧头或弧尾的第一个弧结点。
优点:便于找到入度和出度,且建表的时间复杂度较低;
4)多重链表(邻接多重表)
是无向图的另一种链式存储结构。
边表结点结构:
ivex和jvex:某条边依附的两个顶点在顶点表中的下标。
ilink指向依附顶点ivex的下一条边,
jlink指向依附顶点jvex的下一条边。
4,图的遍历
对于非连通图,可能需要多次遍历才可以访问完所有结点。
1)深度优先遍历(DFS,Depth First Search)
借助于一个栈来实现。
假设以邻接表作为图的存储结构,则按深度优先遍历该图所得到生成树是唯一的。
2)广度优先遍历(BFS,Breadth First Search)
借助一个队列来实现
5,最短路径
1)最小生成树:Prim算法、Kruskal算法、Dijkstra算法。
最小生成树算法是逐次取最短的路径连通未连接节点和“已连接节点集合”。
当权值相同,则最短路径问题转化为求边数最少的问题,BFS可以保证求得源点到汇点的最少边数。
2)Floyd算法(插点法,Floyd-Warshall算法)
①概念
是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被用于计算有向图的传递闭包。Floyd-Warshall算法的时间复杂度为O(N3),空间复杂度为O(N2)。
②算法思想(动态规划)
从任意节点i到任意节点j的最短路径不外乎2种可能:1是直接从i到j,2是从i经过若干个节点k到j。所以,我们假设Dis(i,j)为节点u到节点v的最短路径的距离,对于每一个节点k,我们检查Dis(i,k) + Dis(k,j) < Dis(i,j)是否成立,如果成立,证明从i到k再到j的路径比i直接到j的路径短,我们便设置Dis(i,j) = Dis(i,k) + Dis(k,j),这样一来,当我们遍历完所有节点k,Dis(i,j)中记录的便是i到j的最短路径的距离。
算法描述:
a.从任意一条单边路径开始。所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大。
b.对于每一对顶点 u 和 v,看看是否存在一个顶点 w 使得从 u 到 w 再到 v 比己知的路径更短。如果是更新它。
6,拓扑排序
1)概念
对一个**有向无环图**G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序的序列,简称拓扑序列。
2)思想
拓扑排序常用来确定一个依赖关系集中,事物发生的顺序。拓扑排序得出的线性序列,只要能满足排在前面的任务先完成即可,例如V1→V2,序列中只要V1在V2前面即可(所以得出的序列可能不唯一)。
再进行多线程程序中可能会用到,将多线程单线程化。
结合图进行拓扑排序,满足下面条件即可:
V1在V2,V3,V4前面
V2,V3均在V5前面
V3,V4均在V6前面
V5,V6均在V7前面
A项 V 1 ,V 3 ,V 4 ,V 6 ,V 2 ,V 5 ,V 7 正好满足要求,其它项都不满足,选A。
3)拓扑序列唯一
如果是完全无环,则其弧数必为n-1(其中n为顶点数)
如果仅仅是有向无环,则不一定。如下:
此图拓扑序列唯一,为1234,弧数为4
拓扑排序和图互相都不能唯一确定对方。
4)AOV网(Activity On Vertex Network ):
①概念
网:带权图。若在带权的有向图中,以顶点表示事件,以边(或者弧)表示活动,弧的权值表示活动的开销,则此带权有向图称为用边表示活动的网,简称:AOV网。
如果用AOV网表示一个工程,那么正常情况下工程只有一个开始点和一个结束点,因此AOV网中只有一个入度为0的点,称为源点;一个出度为0的点,称为汇点。
AOV网也是有向无环图。
②性质
1、只有在某顶点所代表的事情发生后,从该顶点出发的弧所代表的活动才能开始。
2、只有在进入某顶点的各弧所代表的活动都已经结束时,该顶点所代表的事情才能发生。
③关键路径
由于AOV网中的某些活动可以并行进行,所以完成整个工程最短时间是从源点到汇点的最大路径长度。具有最大路径长度的路径称为关键路径,关键路径上的活动称为关键活动。
④拓扑排序
步骤:
1、从网中选择一个没有前驱的顶点(入度为0)并且输出它。
2、从网中删去该顶点,并且删去从该顶点发出的全部有向边
3、重复上述两步,直到剩余的网中不存在没有前驱的顶点为止。
排序结果:
此操作有两种结果:
一、网中全部顶点都被输出,这说明网中不存在有向回路;
二、网中顶点未被全部输出,剩余的顶点均有前驱顶点,这说明网中存在有向回路。
5)AOE网(Activity On Edge Network)
①定义
在一个表示工程的带权有向图中,用顶点表示事件,用弧表示活动,用弧上的权值表示活动持续的时间,这种有向图的弧表示活动的网,我们称为AOE网(Activity On Edge Network).AOE网中没有入度的顶点称为始点或源点,没有出度的顶点叫做终点或汇点。
②AOV网和AOE网的不同
它们都是用来对工程建模的,但它们还是有很大的区别,主要体现在AOV网是顶点表示活动的网,它只描述了活动之间的约束关系,而AOE网是用有向边表示活动,边上的权值表示活动持续的时间。AOE网是建立在AOV网基础之上(活动之间约束关系没有矛盾),再来分析完成整个工程至少需要多少时间,或者为缩短完成工程所需时间,应当加快那些活动等问题。
③关键路径
从始点到终点具有最大路径长度(该路径上的各个活动所持续的时间之和)的路径为关键路径。
④应用
i> 下列AOE 网表示一项包含 8 个活动的工程。通过同时加快若干活动的进度可以缩短整个工程的工期。下列选项中,加快其进度就可以缩短工程工期的是( )。
A. c 和 e
B. d 和 e
C. f 和 d
D. f 和 h
解析:
这个网有三条关键路径:
b、d、c、g
b、d、e、h
b、f、h
缩短工期的活动要涵盖三条路径,即在这三条路径中都存在。选C
注意:acg 不是最长路径,不是关键路径。