数据结构第7章 图
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
V2
V3 V4 V2 V3
第7 章
7.1
9.连通图
图
基本定义和术语
在无向图G中,若从顶点vi到顶点vj有路径(当然从vj到vi也 一定有路径),则称vi和vj是连通的。若V(G)中任意两个 不同的顶点vi和vj都连通(即有路径),则称G为连通图 (Connected Graph)。 10.强连通图 在有向图G中,若对于V(G)中任意两个不同的顶点vi和vj,都 存在从vi到vj以及从vj到vi的路径,则称G是强连通图。有 向图G的极大强连通子图称为G的强连通分量。
7.2.2
图
该结点表示边 (Vi Vj),其中的1是Vj 在一维数组中的位置 下标 编号 link
图的存储结构
邻接表
1.无向图的邻接表
关联同一顶点的边:用线性链表存储
顶点:通常按编号顺序将顶点数据存储在一维数组中;
例
V0
V2 V3 V4
V1
0 1 2 3 4 m-1
V0 V1 V2 V3 V4
1 0
V0
V2
V1
V3
V4
0 1 0 1 0
1 0 1 0 1
0 1 0 1 1
1 0 1 0 0
0 1 1 0 0
V2 0 0 0 1 1 0 0 0
V3 1 0 0 0 0 0 1 0
第7 章
7.2
7.2.1
图
图的存储结构
邻接矩阵
用邻接矩阵表示法表示图,除了存储用于表示顶点间相邻关系 的邻接矩阵外,通常还需要用一个顺序表来存储顶点信息。 其形式说明如下:
例
V0,V1,V3,V7,V4,V2,V5,V6,
V0,V1,V4,V7,V3,V2,V5,V6
V0 V0 V1 V1 V3 V3 V4 V4 V4 V5 V5
由于没有规定 访问邻接点的顺序, 深度优先序列不是唯一的
V2 V2 V6 V6
V7 V7
第7 章
7.3.2
图
7.3 图的遍历
广度优先遍历
图中某未访问过的顶点vi出发: 1)访问顶点vi ; 2)访问 vi 的所有未被访问的邻接点w1 ,w2 , …wk ; 3)依次从这些邻接点出发,访问它们的所有未被访问的邻接点; 依此类推, 直到图中所有访问过的顶点的邻接点都被访问; 一种BFS遍历 求图G 的以V0起点的的广度优先序列: 的路径 例 V0,V1,V2,V3,V4,V5,V6,V7 V0 V0 V0 V0
由于没有规定 访问邻接点的顺序, 广度优先序列不是唯一的
V1 V1 V1 V1
V2 V2 V2 V2
V3 V3 V3 V3
V7 V7 V7 V7
V4 V4 V4 V4
V5 V5 V5 V5
V6 V6 V6 V6
第7 章
图
7.4 最小生成树
设图G=(V,E)是一个连通的无向图,则从G的任一顶点出发,进行一次遍历 所经过的边的集合为TE,则T=(V,TE)是G的一个连通子图,即得到G的 一棵生成树。
第7 章
7.5.1
图
单源点最短路径
7.5 最短路径
1.什么是单源点最短路径 单源点最短路径是指:给定一个有向网G=(V,E),并给定其中的 一个点为出发点(单源点),求出该源点到其他各顶点之间的最 短路径。 有向网G,设顶点1为源点,则源点到其余各顶点的最短路径如图 所示
10 1 30 4
6
2 100
第7 章
7.1
6.子图
图
V,E1 E,E1关联
基本定义和术语
设有两个图G=(V,E)、G1=(V1,E1),若V1 的顶点都在V1中,则称 G1是G的子图;
例
(b)、(c) 是 (a) 的子图
V0
V1
V0 V2
V1
V0 V2
V1
V2
V3
(a)
V4
V3
(b)
V4
V3
(c)
V4
第7 章
7.1
图
基本定义和术语
由深度优先遍历得到的生成树称为深度优先生成树,简称为DFS生成树;由广 度优先遍历得到的生成树称为广度优先生成树,简称为BFS生成树。
V1
V1
V2
V2 V3
V3
V4
V5 V6
V7
V4
V5 V6
V7
V8
V8
深度优先生成树
广度优先生成树
第7 章
1.Prim算法
图
7.4 最小生成树
设G=(V,E)为一个具有n个顶点的带权的连通网络,T=(U,TE)为构 造的生成树。
V0
7.4 最小生成树 U={ V0 } V0 1.Prim算法 6 5 1 5 5 V3 V1 V1 V2 6 4 3 2 6
V4 V5 V4
U={ V0,V2,V5}
V0
1
V2
V5 V0 V3 V1
1
V2
V4 V0 V3 V1 V3
4
V5
V0
1
V1 V2 V4 V3 V1
5
1
V2
5
1
V3 V3
4
50 20
3
10 60 5
源点 1 1 1 1
中间顶点
4 4、3
终点 2 4 3 5
路径长度 10 30 50 60
第7 章
7.5.1
图
单源点最短路径
7.5 最短路径
2.迪杰斯特拉算法的基本思想
设源点为Vl,则S中只包含顶点Vl,令W=V-S,则W中包含除Vl外 图中所有顶点,Vl对应的距离值为0,W中顶点对应的距离值是这 样规定的:若图中有弧<Vl,Vj>则Vj顶点的距离为此弧权值,否则 为∞(一个很大的数),然后每次从W中的顶点中选一个其距离 值为最小的顶点Vm加入到S中,每往S中加入一个顶点Vm,就要 对W中的各个顶点的距离值进行一次修改。若加进Vm做中间顶点, 使<Vl,Vm>+<Vm,Vj>的值小于<Vl,Vj>值,则用 <Vl,Vm>+<Vm,Vj>代替原来Vj的距离,修改后再在W中选距离值 最小的顶点加入到S中,如此进行下去,直到S中包含了图中所有 顶点为止。
第7 章
7.1
连 通 图
图
V0 V2 V3 V4 V1 V3 V2 V5 V1
非 强 连 通 图
基本定义和术语
V1 V0 V1 V4
非 连 通 图
强 连 通 图
V0
V0
V2
V3
V2
V3
第7 章
7.1
11.网络
图
基本定义和术语
若将图的每条边都赋上一个权,则称这种带权图为网络 (Network)。
V1
第7 章
7.3
图
图的遍历
图的遍历:从图的某顶点出发,访问图中所有顶点,并且每 个顶点仅访问一次。 有两种遍历方法(它们对无向图,有向图都适用) 深度优先遍历 广度优先遍历 图的遍历与
树的遍历有什么不同
第7 章
7.3.1
图
7.3 图的遍历
深度优先遍历
一种DFS遍历 的路径 从图中某顶点v出发: 1)访问顶点v; 2)依次从Biblioteka Baidu的未被访问的邻接点出发,继续对图进 行深度优先遍历; 求图G以V0起点的的深度优先序列:
第7 章
7.1
图
基本定义和术语
图G,记作G=<V,E> ,其中V是顶点的非空有限集合,E是边的 有限集合,其中边是顶点的无序对或有序对集合。
第7 章
7.1
4.相邻结点
图
基本定义和术语
若(vi,vj)是一条无向边,则称顶点vi和vj互为邻接点 (Adjacent),或称vi和vj相邻接;称边(vi,vj)关联 (Incident)于顶点vi和vj,或称(vi,vj)与顶点vi和vj 相关联。 5.结点的度 对于无向图,顶点v的度(Degree)是关联于该顶点的边的数 目,记为D(v)。
第7 章
7.5.1
图
单源点最短路径
7.5 最短路径
3.迪杰斯特拉算法实现 为了找到从源点Vl到其他顶点的最短路径,引入三个辅助数组 dist[n],s[n],pre[n],其中dist[i-1]记录当前找到的从源点Vl 到终点Vi的最短路径长度,pre[i-1]表示从源点到顶点i的最短路 径上该点的前驱顶点,s用以标记那些已经找到最短路径的顶点, 若s[i-1]=1表示已经找源点到顶点i的最短路径,若s[i-1]=0,则 表示尚未找到。
第7 章
7.5.2
图
所有顶点对之间的最短路径
7.5 最短路径
3.弗洛伊德算法实现 在用弗洛伊德算法求最短路径时,为方便求出中间经过的路径, 增设一个辅助二维数组path[n][n],其中path[i][j]是相应路径上顶 点j的前一顶点的顶点号。
第7 章
1.基本概念
图
7.6 拓扑排序
一个工程(project)可分为若干个称作活动(activity)的子工程, 而这些子工程之间,通常受着一定条件的约束,如其中某些子工 程的开始必须在另一些子工程完成之后。 计算机专业学生的学习就是一个工程,每一门课程的学习就是整 个工程的一些活动。其中有些课程要求先修课程,有些则不要求。 这样在有的课程之间有领先关系,有的课程可以并行地学习。
7.路径、路径长度及回路
在一条路径中,若除起点和终点外,所有顶点各不相同,则称该路径为简 单路径;
由简单路径组成的回路称为简单回路;
在图1中,V0,V1,V2,V3 是简单路径; V0,V1,V2,V4,V1不是简单 路径;在图2中, V0,V2,V3,V0是简单回路;
例
V0
无向图G1
V1
V0
V1
有向图G2
数据结构(C语言)
第7 章
7.1
图
基本定义和术语
图G,记作G=<V,E> ,其中V是顶点的非空有限集合,E是边的 有限集合,其中边是顶点的无序对或有序对集合。 1.有向图 若图G中的每条边都是有方向的,则称G为有向图(Digraph) 2.无向图 若图G中的每条边都是没有方向的,则称G为无向图( Undigraph) 3.完全图 一个有n个结点的无向图,其边的最大数目为n(n-1)/2,边数 达到最大数目的无向图称为无向完全图(Undirected Complete Graph)。
# define n 6 # define e 8 typedef char vextype; typedef float adjtype; typedef struct { vextype vexs[n]; /*图的顶点数*/ /*图的边(弧)数*/ /*顶点的数据类型*/ /*权值类型*/
adjtype arcs[n][n];
(1)初始时,U={u0},TE= ;
(2)在所有u U 、v V-U 的边(u,v)中选择一条权值最小的边,不妨 设为(u,v);
(3)(u,v)加入TE,同时将u 加入U;
(4)重复(2)、(3),直到U=V为止;
6
V0
5
V1
3
1 5 5 V2 6 4
V3
2
V4
6
V5
第7 章
图
U={ V0,V2 }
第7 章
7.5.2
图
所有顶点对之间的最短路径
7.5 最短路径
1.什么是所顶点对之间的最短路径 对于给定的有向网G=(V,E),要对G中任意一对顶点有序对v、 w(v≠w),找出v到w的最短距离和w到v的最短距离。
第7 章
7.5.2
图
所有顶点对之间的最短路径
7.5 最短路径
2.弗洛伊德算法的基本思想 设置一个nxn的矩阵A(k),其中除对角线的元素都等于0外,其他元 素a(k)[i][j]表示顶点i到顶点j的路径长度,K表示运算步骤。开始时 ,以任意两个顶点之间的有向边的权值作为路径长度,没有有向 边时,路径长度为∞,当K=0时,A (0)[i][j]=arcs[i][j], 以后逐步尝试在原路径中加入其他顶点作为中间顶点,如果增加 中间顶点后,得到的路径比原来的路径长度减少了,则以此新路 径代替原路径,修改矩阵元素
} graph;
第7 章
7.2
7.2.2
图
图的存储结构
邻接表
邻接表(Adjacency List)的基本思想:对于图的每个顶点vi, 将所有邻接于vi的顶点链成一个单链表,称为顶点vi的边 表(对于有向图则称为出边表或入边表),所有边表的头 指针,即存储顶点信息的一维数组构成了顶点表。
第7 章
7.2
3 8 6
V2
11
V5
5
V3
4
V4
10
2
第7 章
7.2
图
图的存储结构
7.2.1 邻接矩阵
图的邻接矩阵(Adjacency Matrix)是表示顶点之间相邻关系 的矩阵。设G=(V,E)是具有n个顶点的图,则G的邻接矩阵 V0 V1 A是具有如下性质的n阶方阵:
a i, j :若(vi , v j) E或 vi , v j E 1 E或 vi , v j E 0:若(vi , v j)
V5
2
V4
4
V5
2
3
V4
4
V5
2
U={ V0,V2,V5,V3 } U={ V0,V2,V5,V3,V1 }
U={ V0,V2,V5,V3,V1,V4 }
第7 章
图
7.4 最小生成树
2.Kruskal算法
(1)初始化,构造n个结点和0条边的森林。 (2)选择权值最小的边加入森林。
(3)重复上一步,确保森林可不产生回路,直到该森林变成一棵树为止。
3 2
4
1
0
1
3 2 2
4
第7 章
7.2
7.2.2
图
图的存储结构
邻接表
2.有向图的邻接表
对于有向图来说,根据边的方向,边表可分为两种:出边表和入边表。出边表是指 以顶点vi为起点的边组成的边表。入边表是指以顶点vi为终点的边组成的边表。 如果只保留入边表和出边表之一,则需要占用n+m个结点存储单元。其中n为顶 点个数,m为有向边的数目。