图
定义
基本概念
顶点的度
对无向图: 顶点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的区别:
答案:
- AOV网中,活动由顶点来表示,而AOE网中,活动是通过有向边来表示的。
- 时间表示:在AOV网中,边用来表示活动间的优先关系,通常不附带权重。而在AOE网中,边上的权重代表活动持续的时间,即完成该活动所需的时间长度。
- AOV网用来拓扑排序,AOE网用来求关键路径