6.1 图的基本概念
1.图的定义:图G由顶点集V和边集E组成,记做G = {V,E},其中V(G)表示图G中顶点的有限非空集合。
V表示图G中顶点的个数,也称为图G的阶。E 表示图中边的个数。
注意:线性表可以是空表,树可以时空树,但图不可以是空,即V一定为非空集。
2.无向图、有向图
若E 为无向边的有限集合,则图为无向图。
若E 为有向边(也称为弧)的有限集合时,则图G为有向图。
3.简单图、多重图
简单图-----①不存在重复边②不存在顶点到自身的边
注:数据结构中仅探讨 "简单图"
多重图-----图G中某两个结点之间的边数多余一条,又允许顶点通过同一条边与 自己关联
4.顶点的度、入度、出度
对于无向图-----顶点v的度是指依附于该顶点的边的条数
在具有n个顶点,e条边的无向图中,TD = 2e
即无向图中全部顶点的度的和等于边数的两倍。
对于有向图
入度是以顶点v为终点的有向边的个数
出度是以顶点v为起点的有向边的个数
顶点v的度等于出度+入度
5.顶点---顶点的关系描述
路径----顶点Vp 到顶点Vq之间的一条路径是指顶点序列,
回路----第一个顶点和最后一个顶点相同的路径称之为回路或环
简单路径-----在路径序列当中,顶点不重复出现的路径称之为简单路径。
简单回路-----除了第一个顶点和最后一个顶点以外,其余顶点都不重复的回路称之为简单回路。
路径长度----路径上边的数目。
点到点的距离-----从顶点u出发到顶点v的最短路径若存在,则称此路径的长度为从u到v的距离。
若从u到v根本不存在简单路径,则称该距离为无穷(∞)
无向图中,若从顶点u到顶点v有路径存在,则称u和v是连通的
有向图中,若从顶点v到顶点w,顶点w到顶点u之间都有路径,则称这两个顶点是强连通的
6.连通图、强连通图
若图G中任意两个顶点是连通的,则称图G 为连通图,否则为非连通图
注意:常见考点----对于n个顶点的无向图
若G是连通图,则最少有n-1条边
若G是非连通图,则最多有C2 n-1 条边
若图G中任意一对顶点都是强连通的,则称此图为强连通图。
注意:常见考点----对于n个顶点的有向图G
若G是强连通图,则G至少有n条边(形成回路)
7.子图
设有两个图G=(V,E) 和G'=(V',E').若V‘是V的子集,且E’是E的子集,则称G为G‘的子图。
若有满足V’(G)=V(G)的子图G‘ ,则称其为G的生成子图
无向图中的极大连通子图称为连通分量。
极大连通子图:子图必须连通,并且要包含尽可能多的顶点和边
有向图中的极大连通子图称为有向图的强连通分量
强连通分量:子图必须强连通,同时保留尽可能多的边
8.生成树
连通图的生成树是包含图中全部顶点的一个极小连通子图。
6.2 图的存储
6.2.1 邻接矩阵
邻接矩阵要点:
a)如何计算指定顶点的度、入度、出度(分无向图、有向图来考虑)?时间复杂度如何?
b)如何找到与顶点相邻的边(入边、出边)?时间复杂度如何?
c)如何存储带权图?
d)空间复杂度-----O(|V|^2),适合存储稠密图
只和顶点数相关,和实际的边无关
e)无向图的邻接矩阵为对称矩阵,如何压缩存储?‘
只存储上/下三角区
f)设图G的临界矩阵为A(矩阵要素为0/1),则An的元素An[i][j]等于由顶点i到顶点j的长度为
n的路径的数目
6.2.2 邻接表
邻接表 邻接矩阵
空间复杂度 无向:O(V+2E) 有向:O(V+E) O(E^2)
适用于 存储稀疏图 存储稠密图
表示方法 不唯一 唯一
计算度、入度、出度 计算有向图的度、入度不方便 必须遍历对应的行或列
找相邻的边 找有向图的入边不方便,其余很方便 必须遍历对应的行或列
6.2.3 十字链表
6.2.4 临界多重表
6.2.5 图的基本操作
6.3 图的遍历
6.3.1 广度优先遍历(BFS)
与树的广度优先遍历之间的联系
区别:
树:不存在回路,搜索相邻的 结点时,不可能搜索到已经访问过的结点
树的广度优先遍历(层次遍历):
①若树非空,则根结点入队
②若队列非空,将根节点出队,并访问,同时将该结点的孩子依次入队
③重复②直到队空
图:搜索相邻的结点时,可能会搜索到已经访问过的结点
图的广度优先遍历要点:
①找到与一个顶点相邻的所有顶点
②标记哪些顶点被访问过
③需要一个辅助队列
算法实现
后面再补(*****)
复杂度分析
空间复杂度:最坏情况,辅助队列大小为O(|V|)
时间复杂度:
邻接矩阵存储的图:
访问|V|个顶点需要O(|V|)的时间
查找每个顶点的邻接点需要O(|V|)的时间,而 总共有|V|个顶点
时间复杂度:O(|V|^2)
邻接表存储的图:
访问|V|个顶点需要O(|V|)的时间
查找各个顶点的邻接点需要O(|E|)的时间
时间复杂度:O(|V|+|E|)
广度优先生成树
广度优先生成树由广度优先遍历过程决定,由于邻接表的表示方法不唯一,因此邻接表的广度优先生成树也不唯一。
对于非连通图的广度优先遍历,可得到广度优先生成森林
6.3.2 深度优先遍历(DFS)(有点问题???看视频)
与树的深度优先遍历的联系
树的深度优先遍历(先根、后根):
从根结点出发,能往更深处走就尽量往深处走,每当访问一个结点的时候,要检查是否与当前结点相邻的且没有被访问过的结点,如果有的话就往下一层钻。
图的深度优先遍历类似于树的先根遍历
算法实现
后面再补
复杂度分析
空间复杂度:来自函数调用栈,最好为O(1)
时间复杂度:最坏情况,递归深度O(|V|)
时间复杂度 = 访问各个结点所需的时间+探索各边所需时间
邻接矩阵存储的图:
访问|V|个顶点需要O(|V|)的时间
查找每个结点的邻接点需要 O(|V|)的时间,而总共有|V|个顶点
时间复杂度 = O(|V|^2)
邻接表存储的图;
访问|V|个顶点需要O(|V|)的时间
查找各个顶点的邻接点需要O(|E|)的时间
时间复杂度 = O(|V|+|E|)
深度优先生成树
略
图的遍历和图的连通性
看视频
6.4 关于图的几种算法应用
6.4.1 最小生成树
最小生成树的概念
对于一个带权连通无向图,生成树不同,每棵树的权也可能不同。设R为G的所有生成树的集合,若T为R中边的权值之和最小的生成树,则T称为G的最小生成树。
注意:
①最小生成树可能有多个,但边的权值之和总是唯一且最小的。
②最小生成树的边数 = 顶点数-1 . 砍掉一条边,则不连通,增加一条则出现回路。
③如果一个连通图本身就是一颗树,则其最小生成树就是它本身
④只有连通图才有生成树,非连通图会形成森林
连通图的生成树是包含图中全部顶点的一个极小连通子图。
若图中顶点数为n,则它的生成树含有n-1条边,对生成树而言,
若砍去一条边,则变成非连通图,加上一条边,会形成环(回路)
普利姆算法
从某一个顶点开始构建生成树;
每次将代价最小的新结点纳入到生成树当中,直到所有结点都纳入为止。
时间复杂度:O(|V^2|)
适合用于边稠密图
克鲁斯卡尔算法
每次选择一条权值最小的边,使这条边的两头连通(原本已经连通的就不选)
直到所有结点都连通
时间复杂度:O(|E|log2|E|)
适合于边稀疏图
6.4.2 最短路径问题
1.单元最短路径
BFS算法(无权图)代码
仅适用于无权图,或权值都相同的图
稍后再补
迪杰斯特拉算法(带权图,无权图)
带权路径长度---当图为带权图时,一条路径上所有边的权值之和,称为该路径的带权路径长度
2.各顶点间的最短路径(弗洛伊德算法)
稍后再补
6.4.3 有向无环图描述表达式(后序听课)
若一个有向图中不存在环,则称为有向无环图,简称DAG图。
6.4.4 拓扑排序
AOV网,用顶点表示活动的网
用有向无环图(DAG)表示一个工程,顶点表示活动,有向边表示活动Vi必须优先于Vj
拓扑排序:在一个图论当中, 由一个有向无环图的顶点组成的序列,当且仅当满足以下条件时,称为该图的一个拓扑序列:
①每个顶点出现且只出现一次
②若顶点A在序列中排在顶点B的前面,则在图中不存在顶点B到顶点A的路径。
本质:找到做事的先后顺序
逆拓扑排序
6.4.5 关键路径(AOE)
顶点表示事件,有向边表示活动,以边上的权值表示该活动的开销,称之为用边表示活动的网络。