数据结构-chap7 (1)图的存储结构
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
设在4地(A,B,C,D)之间架设有6座桥,如图所示: 要求从某一地出发,经过每座桥恰巧一次,最后仍回到原地。 (1)试就以上图形说明:此问题有解的条件是什么? (5分) (2)设图中的顶点数为n,试用C或PASCAL描述与求解此问题有关的 数据结构并编写一个算法,找出满足要求的一条回路。(10分) 清华大学2001
主要内容
知识点
– – – – 1.图的定义,概念、术语及基本操作。 2.图的存储结构,特别是邻接矩阵和邻接表。 3.图的深度优先遍历和宽度优先遍历。 4.图的应用(连通分量,最小生成树,拓扑排序,关键路经,最短 路经)。 1.基本概念中,完全图、连通分量、生成树和邻接点是重点。 2.建立图的各种存储结构的算法。 3.图的遍历算法及其应用。 4.通过遍历求出连通分量的个数,深(宽)度优先生成树。 5.最小生成树的生成过程。 6.拓扑排序的求法。关键路经的求法。 7.最短路径的手工模拟。
七桥问题的数学模型
1736 年,欧拉证明了自己的猜想,一次不重复走完七座桥是根本不 可能的。随即,他发表了“一笔画定理”:一个图形要能一笔画完, 必须符合两个条件:(1)图形是封闭连通的;(2)图形中的奇点个 数为0 或2。
欧拉的这个研究成果, 开创了图论和拓扑学这两门新的学科 。这两门学科在计算机科学中有着广泛的应用。由此可见,只 要善于用数学的眼光、数学的方法去观察事物,分析问题,就 能把生活中的一些实际问题转化为数学问题, 并用数学的方法 来处理和解决。
本章目录
7.1 图的定义和术语 7.2 图的存储结构 – 7.2.1 数组表示法 – 7.2.2 邻接表 7.3 图的遍历 – 7.3.1 深度优先搜索 – 7.3.2 广度优先搜索 7.4 图的连通性问题 – 7.4.1 图的连通分量和生成树 – 7.4.2 最小生成树 7.5 有向无环图及其应用 – 7.5.1 拓扑排序 – 7.5.2 关键路径 7.6 最短路径 – 7.6.1 从某个源点到其它各顶点的最短路径 – 7.6.2 每一对顶点之间的最短路径
重点难点
– – – – – – –
图的示例(有向图与无向图)
V1 V3 V4 G1图示 V5 V3 G2图示 V4 V2 V1 V2
结点之间的关系:多对多,任两个结点之间 都可能有关系存在
7.1 图的概念与基本术语
一、图的概念
V1 V3
V2
图G由两个集合构成,记作G=<V,E> 其中,V是顶点的非空有限集合, E是边的有限集合,边是顶点的无序对或有序对集合。 V4
0
V1 e1 V3 V4 V5 V2 1 0 1 0 1
否则
0 1 0 1 1 1 0 1 0 0 0 1 1 0 0 V1 V2 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0
V3 图2
V4
图1
顶点的存储:用一维数组存储(按编号顺序). 顶点间关系:用二维数组存储图的邻接矩阵. 0 1 0 1 0
自测题 4
要连通具有n个顶点的有向图,至少需要()条边。 A.n-l B.n
C.n+l
D.2n 【北京航空航天大学2000一.6(2分)】
自测题 5
G是一个非连通无向图,共有28条边,则该图至少有______个顶点。
【西安电子科技大学2001软件 一.8 (2分)】
7.2
图的存储结构
一 数组表示法 二 邻接表
存在路径,则称G是强连通图。 2 1 4 3 5
ViVj,从Vi到Vj 和从Vj到 Vi都
5 6 3 强连通图 6
连通图 2 1 4 3
非强连通图
5 6
1
2 3
5 6
强连通分量
6、生成树
一个连通图的生成树是一个极小连通子图,它含有图中全部
顶点,但只有足以构成一棵树的n-1条边。 一棵有n个顶点的生成树有且仅有n-1条边。
自测题 2
设无向图的顶点个数为n,则该图最多有( )条边。 A.n-1
B.n(n-1)/2
C.n(n+1)/2 D.0 E.N2 【清华大学1998一.5(分)】
自测题 3
一个有n个结点的图,最少有( )个连通分量,最多有( )个 连通分量。
A. 0
B.1 C.n-1 D.n 【北京邮电大学 2000 二.5 (20/8分)】
例 G1=<V1,E1> V1={v1,v2,v3,v4 ,v5 } E1={(v1,v2),(v1,v4),(v2,v3),(v2,v5),(v3,v4),(v3,v5)}
V5 G1图示
无序对(vi,vj): 用连接顶点vi、vj的线段 表示,称为无向边。
例 G2=<V2,E2> V1 V2={v1,v2,v3,v4 } E2={<v1,v2>, <v1,v3>, <v3,v4> , <v4,v1>} V3
v1 5 v3
3 2 7
v2 4 v4
3 2 4 5 7
数组表示法类型定义
#define MAX_VERTEX_NUM m //最大顶点个数 typedef enum{DG,DN,UDG,UDN}GraphKind; //{有向图,有向网,无向图,无向网} typedef struct ArcCell{ VRType adj; //VRType是顶点关系类型。对无权图,用1或0 //表示相邻否;对带权图,则为权值类型 InfoType *info;//该弧相关信息的指针,对于不带权图,此域不存在 }ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM] ; typedef struct{ VertexType vexs[MAX_VERTEX_NUM]; //存储顶点的一维数组 AdjMatrix arcs; //存储邻接矩阵的二维数组 int vexnum, arcnum ; //图的当前顶点数和弧数 GraphKind kind; //图的种类标志 }MGraph;
0 1 2 3 4
V1 V2 V3 V4 V5
存储顶点的 一维数组
0 1 2 3 4 m m+1 m+2
m-1
存储邻接矩阵 的二维数组
Baidu Nhomakorabea
对于网,可以用aij表示权。若vi和vj不邻接(或没有vi邻接到vj ),
则可以用无限大∞表示权。
v1 v2 v3
0 1 0
1 0 0
0 1 0
V1 e1
V3
V2
V4
V5
邻接点:边的两个顶点 关联边:若边e=(v, u), 则称顶点v、u 关联边e 2、顶点的度、入度、出度
顶点V的度 = 与V相关联的边的数目 在有向图中:
V1
V2
顶点V的入度 = 以V为终点有向边数 顶点V的出度 = 以V为起点有向边数 顶点V的度 = V的出度 + V的入度
1 5 7 1 5 7
3
2
4
6
3
2
4
6
连通图
生成树
7、网
权——与图的边或弧相关的数叫权(值)。
网(络)——带权的图叫网
V1
1 2
V6
V2
1
V5
1
1
5
6
V4
V3
3 1
6
抽象数据类型图的定义
ADT Graph{ 数据对象 V:V是具有相同特性的数据元素的集合,称为顶点集。 数据关系 R:R={VR} VR={<v,w>|v,w V且P(v,w), <v,w>表示从v到w的弧, 谓词P(v,w)定义了弧<v,w>的意义或信息} 基本操作P: GraphCreat(G,,V,VR); GraphDestory(G); GraphLocateVertex(G,v); GraphGetVertex(G,v); GraphFirstAdj(G,v); GraphNextAdj(G,v,w); GraphInsertVertex(G,v); GraphDeleteVertex(G,v); GraphInsertArc(G,v,w); GraphDeleteArc(G,v,w); DFSTtraverse(G,v,Visit()); BFSTtraverse(G,v,Visit()); }ADT Graph
图的存储结构至少要保存两类信息: 1)顶点的数据 2)顶点间的关系
顶点的编号
设 G=<V, E>是图, V={v1,v2,v3, …,vn }, 设顶点的角标为它的编号.
如何表示顶点间的关系?
一、数组表示法
图的任意两个结点(顶点)之间都可能有关系,故用二维数组来表示。 在数组表示法中,用邻接矩阵表示顶点间的关系。 邻接矩阵:G的邻接矩阵是满足如下条件的n阶矩阵: A[i][j]= 0 1 0 1 0 1 若(vi,vj)E 或 <vi,vj>E
V3
V4
3、子图 设有两个图G=(V,E)、G1=(V1,E1), 若V1V,E1E,E1关联的顶点都在V1中, 则称G1是G的子图。 V1 V3 V4 图1 V5 图2 例 图2、图3 是图1的子图 V2 V1 V3 V5 V4 图3 V2 V1 V3 V5 V2
4、路径、回路
无向图中的顶点序列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,则称该序列为回路。
东普鲁士的七桥问题
普莱格尔河(Pregel)穿过美丽的哥尼斯堡城(即现在的俄罗斯的加里宁格勒。哥尼斯 堡在第二次世界大战前属于德国, 是东普鲁士的首府)。普莱格尔河有两个支流,在城 市中心汇成大河,中间是岛区,人们在河上建起了七座桥,如图1 所示。由于岛上有古 老的哥尼斯堡大学, 有知名的教堂, 有大哲学家康德的墓地和塑像, 因此城中的居民 ,尤其是大学生们经常到河岸和上桥散步。在十八世纪初,有一天,有人突发奇想: 如何才能走过七座桥,而每座桥都只能经过一次,最后又回到原来的出发点?当地的 人们开始沉迷于这个问题,在桥上来来回回不知走了多少次,然而却始终不得其解, 这就是著名的哥尼斯堡七桥问题的由来。
七桥问题的数学模型
通过数学建模, 已经把实际问题转化成了数学问题。这时欧拉注意到,如果一个图形 能一笔画成那么除去起点和终点外,其他的点都是经过点。而经过点是有进有出的点 ,即有一条线进这个点,就一定有一条线出这个点。不可能有进无出, 如果有进无出 ,它就是终点;也不可能有出无进,如果有出无进,它就是起点。因此,在经过点进 出的线总数应该是偶数。我们称在一个点进出线的总数是偶数的点为偶点;总数为奇 数的点称为奇点。如果起点和终点是同一个点,那么它也属于有进有出的点,它也是 偶点,这样图上的点全是偶点。如果起点和终点不是同一个点,那么它们必定是奇点 。因此,能够一笔画的图形最多只有两个奇点。
图的主要操作
GraphLocateVertex(G,v); GraphGetVertex(G,v); GraphFirstAdj(G,v); GraphNextAdj(G,v,w);
自测题 1
图中有关路径的定义是( )。 A.由顶点和相邻顶点序偶构成的边所形成的序列
B.由不同顶点所形成的序列
C.由不同边所形成的序列 D.上述定义都不是 【北方交通大学 2001 一.24 (2分)】
七桥问题的数学模型
欧拉想到:岛的形状、大小、以及桥的长短、宽窄并不影响结果,位置才是最重 要的。于是他联想到了莱布尼兹的位置几何学,既然陆地是桥梁的连接地点,不妨 把图中被河隔开的4 块陆地看成4 个点,7 座桥看成7 条连接这4 个点的线,这样将 图形简化,于是就画了如图2的图形。 七桥问题就相当于一笔画出此图形的问题。这是把陆地(平面)用点来表示,把 桥用线来表示。这就是数学大师欧拉对七座桥问题建立起来的数学模型。
有序对<vi,vj> : 用以vi为起点、以vj为终点 的有向线段表示, 称为有向边或弧。
V2
V4 G2图示
无向图:在图G中,若所有边是无向边,则称G为无向图。
有向图:在图G中,若所有边是有向边,则称G为有向图。
二、图的基本术语
有向完全图: n个顶点的有向图最大边数是n(n-1) 无向完全图: n个顶点的无向图最大边数是n(n-1)/2 1、邻接点及关联边
V1 e1 V3 V4
V2
V1
V2
V5
V3
V4
5、连通分量与强连通分量
连通——从顶点Vi到顶点Vj有一条路径,则说Vi和Vj是连通的。 连通图——图中任意两个顶点都是连通的图叫连通图。
连通分量——无向图中的最大(含的边和顶点最多)连通子图。
强连通图——有向图中,如果对每一对Vi,VjV,