72第七章 图(1)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
结束
第 9 页
10 InsertArc(&G, v, w); 初始条件:图G存在,v和w是G中两个顶点。 操作结果:在G中增添弧<v,w>,若G是无向的,则还增添对称弧<w,v> 11 DeleteArc(&G, v, w); 初始条件:图G存在,v和w是G中两个顶点。 操作结果:在G中删除弧<v,w>,若G是无向的,则还删除对称弧<w,v> 12 DFSTraverse(G, v, Visit( )); 初始条件:图G存在,v是G中某个顶点,Visit是顶点的应用函数。 操作结果:从顶点v起深度优先遍历图G,对每个顶点调用函数Visit一次 且仅一次。一旦visit( )失败,则操作失败 13 BFSTraverse(G, v, Visit( )); 初始条件:图G存在,v是G中某个顶点,Visit是顶点的应用函数。 操作结果:从顶点v起广度优先遍历图G,对每个顶点调用函数Visit一次 且一次。一旦visit( )失败,则操作失败
数组表示法是图的一种顺序存储结构 在数组表示法中,用邻接矩阵表示顶点间的关系 邻接矩阵:G的邻接矩阵是满足如下条件的n阶矩阵:
A[i][j]=
V1 V3 V4 V5 V2
1 若(vi,vj)E 或 <vi,vj>E
ห้องสมุดไป่ตู้
0 否则
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 V1 V2 0 0 0 1 1 0 0 0 1 0 0 0 0 0 1 0
图1
图2
图3
结束
第 14 页
6 连通分图(强连通分量)
无向图G的极大连通子图称为G的连通分量 极大连通子图意思是:该子图是G连通子图,将G的任何不在该子图 中的顶点加入,子图不再连通; 有向图D的极大强连通子图称为D的强连通分量 极大强连通子图意思是:该子图是D强连通子图,将D的任何不在该 子图中的顶点加入,子图不再是强连通的; 连通分图 V1 V2 V5
结束
第 21 页
设G是Mgraph 类型的变量,用于存储无向图,该图有n个顶点,e条边 G的图示如下:
G.vexs
G.arcs
V1
顶点 数组
0 存储邻接矩阵 的二维数组
G.vexnum G.arcnu G.kind
n e AG
结束
第 22 页
无向图数组表示法特点: 1)无向图邻接矩阵是对称矩阵,同一条边表示了两次; 2)顶点v的度:等于二维数组对应行(或列)中1的个数; 3)判断两顶点v、u是否为邻接点:只需判二维数组对应分量是否为1; 4)顶点不变,在图中增加、删除边:只需对二维数组对应分量赋值1或 清0; 5)设存储顶点的一维数组大小为m(m图的顶点数n), G占用存储空间: m+m2;G占用存储空间只与它的顶点数有关,与边数无关;适用于边稠密 的图; 对有向图的数组表示法可做类似的讨论
V1
V2
V3 G2图示
V4
无向图:在图G中,若边是无向边,则称G为无向图; 有向图:在图G中,若边是有向边,则称G为有向图;
结束
第 6 页
二 图的应用举例
例1 交通图(公路、铁路) 顶点:地点 边:连接地点的公路 交通图中的有单行道双行道,分别用有向边、无向边表示; 例2 电路图 顶点:元件 边:连接元件之间的线路 V1 V2 例3 通讯线路图 顶点:地点 V3 边:地点间的通信线 V4 V5 例4 各种流程图 如产品的生产流程图 顶点:工序 边:各道工序之间的顺序关系
结束
第 23 页
//获得顶点u的序号 int LocateVex(MGraph G,VertexType u) { for(i=0;i<G.vexnum;i++) if(strcmp(G.vexs[i],u)==0) return i; return -1; } //获得v的第一个邻接顶点的序号 enum GraphKind{DG,DN,UDG,UDN} //存在邻接顶点则返回其在数组中序号,否则返回 -1 int FirstAdjVex(MGraph G,VertexType v) { i=LocateVex(G,v); if(G.kind%2) k=INFINITY; for(j=0;j<G.vexnum;j++) if(G.arcs[i][j].adj!=k) return j; return -1; }
结束
第 3 页
第七章 图
7.1 7.2 图的定义和术语 图的存储结构 7.4 图的连通性 7.4 .1 无向图的连通分量和生成树 7.4 .2 最小生成树 7.5 有向无环图及其应用 7.5 .1 拓扑排序 7.5 .2 关键路径 7.6 最短路径
7.2 .1 数组表示法 7.2 .2 邻接表 7.2 .3 十字链表 7.2 .4 邻接多重表 7.3 图的遍历
无序对(vi,vj): 用连接顶点vi、vj的线段 表示,称为无向边;
V1 V3 V4
V2
V5
G1图示
结束
第 5 页
例 G2=<V2,E2> V2={v1,v2,v3,v4 } E2={<v1,v2>, <v1,v3>, <v3,v4> , <v4,v1>}
有序对<vi,vj> : 用以为vi起点、以vj为终点 的有向线段表示,称为有向 边或弧;
V3
V5
V2
V4
结束
第 11 页
3 路径、回路 无向图中的顶点序列v1,v2,… ,vk,若(vi,vi+1)E( i=1,2,…k-1), v =v1, u =vk, 则称该序列是从顶点v到顶点u的路径;若v=u,则称 该序列为回路; 有向图D=(V,E)中的顶点序列v1,v2,… ,vk, 若<vi,vi+1>E ( i=1,2,…k-1), v =v1, u =vk, 则称该序列是从顶点v到顶点u的路 径;若v=u,则称该序列为回路;
结束
第 16 页
若T是G的生成树当且仅当T满足如下条件:
T是G的连通子图 T包含G的所有顶点 T中无回路
V1 V3 V4
V2
V1 V3
V2
V5
V4
V5
结束
第 17 页
7.2
图的存储结构
图是多对多的结构,比线性结构、树结构复杂,所以其存储结构也 要复杂些。与线性结构、树结构一样,图的存储结构至少要保存两类信 息: 1)顶点的数据 2)顶点间的关系
结束
第 8 页
6 FirstAdjVex(G, v); 初始条件:图G存在,v是G中某个顶点 操作结果:返回v的第一个邻接顶点。若顶点在G中没有邻接顶点,则返 回“空”。 7 NextAdjVex(G, v, w); 初始条件:图G存在,v是G中某个顶点,w是v的邻接顶点。 操作结果:返回v的(相对于w的)下一个邻接顶点。若w是v的最后一个 邻接点,则返回“空”。 8 InsertVex(&G, v); 初始条件:图G存在,v和图中顶点有相同特征。 操作结果:在图G中增添新顶点v 9 DeleteVex(&G, v); 初始条件:图G存在,v和图中顶点有相同特征 操作结果:删除G中顶点v及相关的弧
7.3 .1 广度优先遍历 7.3 .2 深度优先遍历
7.6 .1 从某个源点到其余各顶点的最短路径 7.6 .2 每一对顶点之间的最短路径
结束
第 4 页
7.1
一 图的概念
图的定义和术语
图G由两个集合构成,记作G=<V,E> 其中V是顶点的非空有限集合, E是边的有限集合,其中边是顶点的无序对或有序对集合。 例 G1=<V1,E1> V1={v1,v2,v3,v4 ,v5 } E1={(v1,v2),(v1,v4),(v2,v3),(v2,v5),(v3,v4),(v3,v5)}
结束
第 10 页
三 图的基本术语
1 邻接点及关联边 V1 邻接点:边的两个顶点 关联边:若边e= (v, u), 则称顶点v、u 关连边e 2 顶点的度、入度、出度 V4 顶点V的度=与V相关联的边的数目 在有向图中: 顶点V的出度=以V为起点有向边数 V1 顶点V的入度=以V为终点有向边数 顶点V的度= V的出度+V的入度 设图G的顶点数为n,边数为e V3 图的所有顶点的度数和 = 2*e (每条边对图的所有顶点的度数和“贡献”2度) e1 V2
第 20 页
数组表示法类型定义 #define MAX_VERTEX_NUM m //最大顶点个数 typedef enum {DG,DN,UDG,UDN}GraphKind; //{有向图,有向网,无向 图,无向网} 此处省略了*info域 typedef struct ArcCell { VRType adj; //VRType 是顶点关系类型。对无权图,用1或0 //表示相邻否;对带权图,则为权值类型。 }ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedef struct { VertexType vexs[MAX_VERTEX_NUM]; //存储顶点的一维数组 AdjMatrix arcs; //存储邻接矩阵的二维数组 int vexnum, arcnum; //图的当前顶点数和弧数 GraphKind kind; //图的种类标志 }Mgraph;
V1 V3 V4
V2
V1
V2
V5
V4
V3
V6
连通图
非连通图
结束
第 13 页
5 子图
设有两个图G=(V,E)、G1=(V1,E1),若V1 V,E1 E,E1 关联的顶点都在V1中,则称 G1是G的子图;
例 图2、图3 是 图1 的子图
V1
V3
V1
V3 V4
V2
V2
V1 V3
V2
V5
V5
V4
V5
例
在图1中,V1,V2,V3,V4 是V1到V4的路径; V1,V2,V3,V4,V1是回路; 在图2中,V1,V3,V4 是V1到V4的路径; V1,V3,V4,V1是回路; V1 图1 V4 V3 V5 V2 V1 V2 图2
V3
V4
结束
第 12 页
4 连通图、(强连通图)
在无(有)向图G=< V, E >中,若对任何两个顶点v、u都存在从v 到u的路径,则称G是连通图(强连通图) V5
V3
V4
结束
第 19 页
数组表示法 顶点的存储:用一维数组存储(按编号顺序) 顶点间关系:用二维数组存储图的邻接矩阵;
0 1 2 3 4 5 V1 V2 V3 V4 V5 存储顶点的 一维数组
0 1 2 3 4
m m+1 m+2 m+3 m+4
0 1 0 1 0
1 0 1 0 1
结束
存储邻接矩阵的 二维数组 m-1
结束
第 7 页
三 图的基本操作 1 CreateGraph(&G, V, VR); 初始条件:V是图的顶点集,VR是图中弧的集合 操作结果:按V和VR的定义构造图G 2 DestroyGraph(&G); 初始条件:图G存在 操作结果:销毁图G 3 LocateVex(G,u); 初始条件:图G存在,u和G中顶点有相同特征 操作结果:若G中存在顶点u,则返回该顶点在图中位置;否则返回其它 信息。 4 GetVex(G, v); 初始条件:图G存在,v是G中某个顶点 操作结果:返回v的值 5 PutVex(&G, v, value); 初始条件:图G存在,v是G中某个顶点
V4
V3
V6
结束
第 15 页
7
生成树 * 一个连通图的生成树是一个极小连通子图,它含有图中全部顶点 ,但只有足以构成一棵树的n-1条边。在一棵生成树上任添一条边,就 构成环。 * 一棵有n个顶点的生成树有且仅有n-1条边。 * 如果一个图有n个顶点,而边数小于n-1,则图不连通,多于n-1条 边,一定有环。 * 如果一个图中恰有一个顶点入度为0,其余入度均为1,则图是一 棵有向树。
结束
第 1 页
第七 章
图
本章介绍另一种非线性数据结构 —— 图 图:是一种多对多的结构关系,每个元素可以有 零个或多个直接前趋;零个或多个直接后继;
结束
第 2 页
第七 章
图
学习要点 1.熟悉图的各种存储结构及其构造算法,了解实际问题的求解效率与采 用何种存储结构和算法的密切联系; 2.熟练掌握图的两种遍历,深度优先遍历和广度优先遍历。在学习中应 注意图的遍历算法与树的遍历算法之间的类似和差异。树的先根遍历是 一种深度优先搜索策略,树的层次遍历是一种广度优先搜索策略
顶点的编号 为了使图的存储结构与图一一对应,在讨论图的存储结构时,首先 要给图的所有顶点编号。 我们主要介绍图的两种存储结构 数组表示法 邻接表(邻接表,逆邻接表) 设 G=<V, E>是图, V={v1,v2,v3, … vn },设顶点的角标为它的编号 如何表示顶点间的关系?
结束
第 18 页
7.2.1 数组表示法
第 9 页
10 InsertArc(&G, v, w); 初始条件:图G存在,v和w是G中两个顶点。 操作结果:在G中增添弧<v,w>,若G是无向的,则还增添对称弧<w,v> 11 DeleteArc(&G, v, w); 初始条件:图G存在,v和w是G中两个顶点。 操作结果:在G中删除弧<v,w>,若G是无向的,则还删除对称弧<w,v> 12 DFSTraverse(G, v, Visit( )); 初始条件:图G存在,v是G中某个顶点,Visit是顶点的应用函数。 操作结果:从顶点v起深度优先遍历图G,对每个顶点调用函数Visit一次 且仅一次。一旦visit( )失败,则操作失败 13 BFSTraverse(G, v, Visit( )); 初始条件:图G存在,v是G中某个顶点,Visit是顶点的应用函数。 操作结果:从顶点v起广度优先遍历图G,对每个顶点调用函数Visit一次 且一次。一旦visit( )失败,则操作失败
数组表示法是图的一种顺序存储结构 在数组表示法中,用邻接矩阵表示顶点间的关系 邻接矩阵:G的邻接矩阵是满足如下条件的n阶矩阵:
A[i][j]=
V1 V3 V4 V5 V2
1 若(vi,vj)E 或 <vi,vj>E
ห้องสมุดไป่ตู้
0 否则
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 V1 V2 0 0 0 1 1 0 0 0 1 0 0 0 0 0 1 0
图1
图2
图3
结束
第 14 页
6 连通分图(强连通分量)
无向图G的极大连通子图称为G的连通分量 极大连通子图意思是:该子图是G连通子图,将G的任何不在该子图 中的顶点加入,子图不再连通; 有向图D的极大强连通子图称为D的强连通分量 极大强连通子图意思是:该子图是D强连通子图,将D的任何不在该 子图中的顶点加入,子图不再是强连通的; 连通分图 V1 V2 V5
结束
第 21 页
设G是Mgraph 类型的变量,用于存储无向图,该图有n个顶点,e条边 G的图示如下:
G.vexs
G.arcs
V1
顶点 数组
0 存储邻接矩阵 的二维数组
G.vexnum G.arcnu G.kind
n e AG
结束
第 22 页
无向图数组表示法特点: 1)无向图邻接矩阵是对称矩阵,同一条边表示了两次; 2)顶点v的度:等于二维数组对应行(或列)中1的个数; 3)判断两顶点v、u是否为邻接点:只需判二维数组对应分量是否为1; 4)顶点不变,在图中增加、删除边:只需对二维数组对应分量赋值1或 清0; 5)设存储顶点的一维数组大小为m(m图的顶点数n), G占用存储空间: m+m2;G占用存储空间只与它的顶点数有关,与边数无关;适用于边稠密 的图; 对有向图的数组表示法可做类似的讨论
V1
V2
V3 G2图示
V4
无向图:在图G中,若边是无向边,则称G为无向图; 有向图:在图G中,若边是有向边,则称G为有向图;
结束
第 6 页
二 图的应用举例
例1 交通图(公路、铁路) 顶点:地点 边:连接地点的公路 交通图中的有单行道双行道,分别用有向边、无向边表示; 例2 电路图 顶点:元件 边:连接元件之间的线路 V1 V2 例3 通讯线路图 顶点:地点 V3 边:地点间的通信线 V4 V5 例4 各种流程图 如产品的生产流程图 顶点:工序 边:各道工序之间的顺序关系
结束
第 23 页
//获得顶点u的序号 int LocateVex(MGraph G,VertexType u) { for(i=0;i<G.vexnum;i++) if(strcmp(G.vexs[i],u)==0) return i; return -1; } //获得v的第一个邻接顶点的序号 enum GraphKind{DG,DN,UDG,UDN} //存在邻接顶点则返回其在数组中序号,否则返回 -1 int FirstAdjVex(MGraph G,VertexType v) { i=LocateVex(G,v); if(G.kind%2) k=INFINITY; for(j=0;j<G.vexnum;j++) if(G.arcs[i][j].adj!=k) return j; return -1; }
结束
第 3 页
第七章 图
7.1 7.2 图的定义和术语 图的存储结构 7.4 图的连通性 7.4 .1 无向图的连通分量和生成树 7.4 .2 最小生成树 7.5 有向无环图及其应用 7.5 .1 拓扑排序 7.5 .2 关键路径 7.6 最短路径
7.2 .1 数组表示法 7.2 .2 邻接表 7.2 .3 十字链表 7.2 .4 邻接多重表 7.3 图的遍历
无序对(vi,vj): 用连接顶点vi、vj的线段 表示,称为无向边;
V1 V3 V4
V2
V5
G1图示
结束
第 5 页
例 G2=<V2,E2> V2={v1,v2,v3,v4 } E2={<v1,v2>, <v1,v3>, <v3,v4> , <v4,v1>}
有序对<vi,vj> : 用以为vi起点、以vj为终点 的有向线段表示,称为有向 边或弧;
V3
V5
V2
V4
结束
第 11 页
3 路径、回路 无向图中的顶点序列v1,v2,… ,vk,若(vi,vi+1)E( i=1,2,…k-1), v =v1, u =vk, 则称该序列是从顶点v到顶点u的路径;若v=u,则称 该序列为回路; 有向图D=(V,E)中的顶点序列v1,v2,… ,vk, 若<vi,vi+1>E ( i=1,2,…k-1), v =v1, u =vk, 则称该序列是从顶点v到顶点u的路 径;若v=u,则称该序列为回路;
结束
第 16 页
若T是G的生成树当且仅当T满足如下条件:
T是G的连通子图 T包含G的所有顶点 T中无回路
V1 V3 V4
V2
V1 V3
V2
V5
V4
V5
结束
第 17 页
7.2
图的存储结构
图是多对多的结构,比线性结构、树结构复杂,所以其存储结构也 要复杂些。与线性结构、树结构一样,图的存储结构至少要保存两类信 息: 1)顶点的数据 2)顶点间的关系
结束
第 8 页
6 FirstAdjVex(G, v); 初始条件:图G存在,v是G中某个顶点 操作结果:返回v的第一个邻接顶点。若顶点在G中没有邻接顶点,则返 回“空”。 7 NextAdjVex(G, v, w); 初始条件:图G存在,v是G中某个顶点,w是v的邻接顶点。 操作结果:返回v的(相对于w的)下一个邻接顶点。若w是v的最后一个 邻接点,则返回“空”。 8 InsertVex(&G, v); 初始条件:图G存在,v和图中顶点有相同特征。 操作结果:在图G中增添新顶点v 9 DeleteVex(&G, v); 初始条件:图G存在,v和图中顶点有相同特征 操作结果:删除G中顶点v及相关的弧
7.3 .1 广度优先遍历 7.3 .2 深度优先遍历
7.6 .1 从某个源点到其余各顶点的最短路径 7.6 .2 每一对顶点之间的最短路径
结束
第 4 页
7.1
一 图的概念
图的定义和术语
图G由两个集合构成,记作G=<V,E> 其中V是顶点的非空有限集合, E是边的有限集合,其中边是顶点的无序对或有序对集合。 例 G1=<V1,E1> V1={v1,v2,v3,v4 ,v5 } E1={(v1,v2),(v1,v4),(v2,v3),(v2,v5),(v3,v4),(v3,v5)}
结束
第 10 页
三 图的基本术语
1 邻接点及关联边 V1 邻接点:边的两个顶点 关联边:若边e= (v, u), 则称顶点v、u 关连边e 2 顶点的度、入度、出度 V4 顶点V的度=与V相关联的边的数目 在有向图中: 顶点V的出度=以V为起点有向边数 V1 顶点V的入度=以V为终点有向边数 顶点V的度= V的出度+V的入度 设图G的顶点数为n,边数为e V3 图的所有顶点的度数和 = 2*e (每条边对图的所有顶点的度数和“贡献”2度) e1 V2
第 20 页
数组表示法类型定义 #define MAX_VERTEX_NUM m //最大顶点个数 typedef enum {DG,DN,UDG,UDN}GraphKind; //{有向图,有向网,无向 图,无向网} 此处省略了*info域 typedef struct ArcCell { VRType adj; //VRType 是顶点关系类型。对无权图,用1或0 //表示相邻否;对带权图,则为权值类型。 }ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedef struct { VertexType vexs[MAX_VERTEX_NUM]; //存储顶点的一维数组 AdjMatrix arcs; //存储邻接矩阵的二维数组 int vexnum, arcnum; //图的当前顶点数和弧数 GraphKind kind; //图的种类标志 }Mgraph;
V1 V3 V4
V2
V1
V2
V5
V4
V3
V6
连通图
非连通图
结束
第 13 页
5 子图
设有两个图G=(V,E)、G1=(V1,E1),若V1 V,E1 E,E1 关联的顶点都在V1中,则称 G1是G的子图;
例 图2、图3 是 图1 的子图
V1
V3
V1
V3 V4
V2
V2
V1 V3
V2
V5
V5
V4
V5
例
在图1中,V1,V2,V3,V4 是V1到V4的路径; V1,V2,V3,V4,V1是回路; 在图2中,V1,V3,V4 是V1到V4的路径; V1,V3,V4,V1是回路; V1 图1 V4 V3 V5 V2 V1 V2 图2
V3
V4
结束
第 12 页
4 连通图、(强连通图)
在无(有)向图G=< V, E >中,若对任何两个顶点v、u都存在从v 到u的路径,则称G是连通图(强连通图) V5
V3
V4
结束
第 19 页
数组表示法 顶点的存储:用一维数组存储(按编号顺序) 顶点间关系:用二维数组存储图的邻接矩阵;
0 1 2 3 4 5 V1 V2 V3 V4 V5 存储顶点的 一维数组
0 1 2 3 4
m m+1 m+2 m+3 m+4
0 1 0 1 0
1 0 1 0 1
结束
存储邻接矩阵的 二维数组 m-1
结束
第 7 页
三 图的基本操作 1 CreateGraph(&G, V, VR); 初始条件:V是图的顶点集,VR是图中弧的集合 操作结果:按V和VR的定义构造图G 2 DestroyGraph(&G); 初始条件:图G存在 操作结果:销毁图G 3 LocateVex(G,u); 初始条件:图G存在,u和G中顶点有相同特征 操作结果:若G中存在顶点u,则返回该顶点在图中位置;否则返回其它 信息。 4 GetVex(G, v); 初始条件:图G存在,v是G中某个顶点 操作结果:返回v的值 5 PutVex(&G, v, value); 初始条件:图G存在,v是G中某个顶点
V4
V3
V6
结束
第 15 页
7
生成树 * 一个连通图的生成树是一个极小连通子图,它含有图中全部顶点 ,但只有足以构成一棵树的n-1条边。在一棵生成树上任添一条边,就 构成环。 * 一棵有n个顶点的生成树有且仅有n-1条边。 * 如果一个图有n个顶点,而边数小于n-1,则图不连通,多于n-1条 边,一定有环。 * 如果一个图中恰有一个顶点入度为0,其余入度均为1,则图是一 棵有向树。
结束
第 1 页
第七 章
图
本章介绍另一种非线性数据结构 —— 图 图:是一种多对多的结构关系,每个元素可以有 零个或多个直接前趋;零个或多个直接后继;
结束
第 2 页
第七 章
图
学习要点 1.熟悉图的各种存储结构及其构造算法,了解实际问题的求解效率与采 用何种存储结构和算法的密切联系; 2.熟练掌握图的两种遍历,深度优先遍历和广度优先遍历。在学习中应 注意图的遍历算法与树的遍历算法之间的类似和差异。树的先根遍历是 一种深度优先搜索策略,树的层次遍历是一种广度优先搜索策略
顶点的编号 为了使图的存储结构与图一一对应,在讨论图的存储结构时,首先 要给图的所有顶点编号。 我们主要介绍图的两种存储结构 数组表示法 邻接表(邻接表,逆邻接表) 设 G=<V, E>是图, V={v1,v2,v3, … vn },设顶点的角标为它的编号 如何表示顶点间的关系?
结束
第 18 页
7.2.1 数组表示法