目录
一:图的基本概念
1.顶点的度、入度、出度:
- 对于无向图:在具有n个顶点、e条边的无向图中,无向图的全部顶点的度的和等于边数的2倍
- 对于有向图:顶点v的度等于其入度和出度之和,亦等于有向边数
2.顶点-顶点的关系描述:
- 路径:顶点vp到顶点vq之间的一条路径是指顶点序列,
- 回路:第一个顶点和最后一个顶点相同的路径称为回路或环
- 简单路径:在路径序列中,顶点不重复出现的路径称为简单路径。
- 简单回路:除第一个顶点和最后一个顶点外,其余顶点不重复出现的回路称为简单回路。
- 路径长度:路径上边的数目
3.连通图、强连通图:
- 若图G中任意两个顶点都是连通的,则称图G为连通图,否则称为非连通图。
- 对于n个顶点的无向图G,
- 若G是连通图,则最少有n-1条边
- 若G是非连通图,则最多可能有
条边
- 题例:设G是一个非连通无向图,有15条边,则该图的顶点数至少有7个。
- 若图中任何一对顶点都是强连通的,则称此图为强连通图。
- 对于n个顶点的有向图G,
- 若G是强连通图,则最少有n条边(形成回路)
在一个非强连通图中找强连通分量的方法如下:
(1)在图中找有向环
(2)扩展该有向环:如果某个顶点到该环中的任一顶点有路径,并且该环中的任一顶点到这个顶点也有了路径,则加入这个顶点
重连通图
4.研究图的局部——子图:
- 设有两个图G = (V, E)和G' = (V', E'),若V'是V的子集,且E'是E的子集,则称G'是G的子图
- 若有满足V(G') = V(G)的子图G',则称其为G的生成子图
- 注意:并非任意挑几个点、几条边都能构成子图
5.生成树:
- 连通图的生成树是包含图中全部顶点的一个极小连通子图
- 若图中顶点数为n,则它的生成树含有n-1条边。对生成树而言,若砍去它的一条边,则会变成非连通图,若加上一条边则会形成一个回路。
- 注:极大连通子图是连通分量,极小连通子图是生成树。
二:图的存储结构
1.邻接矩阵
(1)邻接矩阵法求顶点的度/出度/入度的时间复杂度为O(V)
(2)邻接矩阵空间复杂度:O(|V|^2) ——只和顶点数相关,和实际的边数无关
(3)图的邻接矩阵表示是唯一的
(4)无向图的邻接矩阵一定是对称的,反之若不对称则一定是有向图
邻接矩阵法的性质
证明:
2.邻接表
(1)无向图:边结点的数量是2|E|,整体空间复杂度为O(|V| + 2|E|)
(2)有向图:边结点的数量是|E|,整体空间复杂度为O(|V| + |E|)
(3)只要确定了顶点编号,图的邻接矩阵表示方式唯一,图的邻接表表示方式并不唯一
3.十字链表
用来存储有向图,空间复杂度:O(|V|+|E|)
4.邻接多重表
用来存储无向图,空间复杂度:O(|V|+|E|)
总结
二:最小生成树
1.Prim算法构造步骤
证明普里姆算法得到的树T是最小生成树
证:假设图的最小生成树为T’且T不等于T '。 在T的构建过程中,第一次出现不同的边为e,e有一个顶点u属于S,另一个顶点v不属于S。由于T '是生成树必定连通,因此在T '中u到v存在路径,其中必定有一条边f一端属于V,另一端不属于 V。由Prim算法的构造方式可知:W(e)<=W(f),若W(e)<W(f),则去掉f加入e得到的树权值会更小,矛盾。因此T的权值要等于T ' 的权值,即得证。
2.Kruskal算法构造步骤
证明克鲁斯卡尔算法得到的树T是最小生成树
归纳法证明:
n=1时显然成立。
假设n=k时命题成立。
n=k+1时,选出最短边e(最小生成树一定包含最短边,否则可以加上它,然后删除环中其它的边),将其短接,得到最小生成树T '。 假设原图的最小生成树为T*
,且W(T
*
)<W(T)。
则W(T*
-e)=W(T
*
)-W(e)<W(T)-W(e)=W(T '),这与T '是最小生成树矛盾,因此命题得证。
三:最短路径
1.Dijkstra算法
Dijkstra 算法不适用于有负权值的带权图
2.Floyd算法
- Floyd算法可以用于负权图
- Floyd 算法不能解决带有“负权回路”的图(有负权值的边组成回路),这种图有可能没有最短路径(每走一圈路径越小)
Floyd不断基于对角线上元素画“十字”计算的过程步骤:
1.从第一个对角线元素开始不断画十字
2.十字和它的部分对应的行列值不变
3.更新值(值比原来元素小)与路径,取下一个对角线元素继续重复
四:AOV网和AO
拓扑排序:
- 拓扑排序:在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序:
- 每个顶点出现且只出现一次。
- 若顶点A在序列中排在顶点B的前面,则在图中不存在从顶点B到顶点A的路径。
- 或定义为:
- 拓扑排序是对有向无环图的顶点的一种排序,它使得若存在一条从顶点A到顶点B的路径,则在排序中顶点B出现在顶点A的后面。
- 每个AOV网都有一个或多个拓扑排序序列。
- 如果一个有向图具有拓扑排序序列,并且顶点按拓扑有序序列编号,那么它的邻接矩阵必定为上三角矩阵
- 若用邻接矩阵存储有向图,矩阵中主对角线以下元素均为零,则该图的拓扑排序一定存在,但不一定唯一
- 改变某一关键活动的持续时间,不一定会产生不同的关键路径
- 拓扑排序的实现:
- 从AOV网中选择一个没有前驱(入度为0)的顶点并输出。
- 从网中删除该顶点和所有以它为起点的有向边。
- 重复前面的步骤直到当前的AOV网为空或当前网中不存在无前驱的顶点为止。
AOE网
关键路径
- 在带权有向图中,以顶点表示事件,以有向边表示活动,以边上的权值表示完成该活动的开销(如完成活动所需的时间)
- 称之为用边表示活动的网络,简称AOE网 (Activity On Edge NetWork)
- AOE网具有以下两个性质:
- 只有在某顶点所代表的事件发生后,从该顶点出发的各有向边所代表的活动才能开始;
- 只有在进入某顶点的各有向边所代表的活动都已结束时,该顶点所代表的事件才能发生。
- 另外,有些活动是可以并行进行的
求关键路径的步骤:
- 求所有事件的最早发生时间 ve( )
- 按拓扑排序序列,依次求各个顶点的 ve(k):
- ve(源点) = 0
- ve(k) = Max{ve(j) + Weight(vj, vk)}, vj为vk 的任意前驱
- 求出事件的最早发生时间后即可立马推出活动的最早发生时间
- 求所有事件的最迟发生时间 vl( )
- 按逆拓扑排序序列,依次求各个顶点的 vl(k):
- vl(汇点) = ve(汇点)
- vl(k) = Min{vl(j) - Weight(vk, vj)} , vj为vk的任意后继
- 求出事件的最迟发生时间后即可立马推出活动的最迟发生时间
- 求所有活动的最早发生时间 e( )
- 若边<vk, vj>表示活动ai,则有e(i) = ve(k)
- 求所有活动的最迟发生时间 l( )
- 若边<vk, vj>表示活动ai,则有l(i) = vl(j) - Weight(vk, vj)
- 求所有活动的时间余量 d( )
- d(i) = l(i) - e(i)
- d(i)=0的活动就是关键活动, 由关键活动可得关键路径
关键活动、关键路径的特性:
- 若关键活动耗时增加,则整个工程的工期将增长
- 缩短关键活动的时间,可以缩短整个工程的工期
- 当缩短到一定程度时,关键活动可能会变成非关键活动
- 可能有多条关键路径,只提高一条关键路径上的关键活动速度并不能缩短整个工程的工期,只有加快那些包括在所有关键路径上的关键活动才能达到缩短工期的目的。