第6章 图—数据结构

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

简单回路或简单环的定义:起点与终点相同的简单路径。
简单环 简单路径 路径1、3、2、4
数据结构
励志照亮人生
编程改变命运
7
6.1 图的概念及相关术语
二、图的相关术语 6、连通、连通图、连通分量 连通的定义:若从一个顶点到另一个顶点互有路径。 连通图的定义:无向图中任意两顶点连通。 连通分量的定义:无向图的极大连通子图(连通且子图)。
数据结构
励志照亮人生
编程改变命运
4
6.1 图的概念及相关术语
二、图的相关术语 1、无向完全图的定义 :无向图中任意两个顶点之间均有边 相连接 。n个顶点的无向完全图中有n(n-1)/2条边。 2、有向完全图的定义:有向图中任意两个顶点之间均有方 向互为相反两条边相连接 。有向完全图中有n(n-1)条边。 3、无向图中度的定义:与该顶点相关联的边的数目 。
(4)重复第三步,直到U中包含所有顶点,此时U=V,E 中必有n-1条边(图G有n个顶点)
注:步骤3保证了生成树不会出现回路,因为两个顶点的 集合U和V-U,正好其顶点互不相同。
数据结构 励志照亮人生 编程改变命运 24
6.4最小生成树
二、普里姆(Prim)算法 对Prim算法,引入一个辅助数组lowcost[ ]用于保存U集合的
3、最小生成树的定义:权最小的生成树,可简记为MST。
4、作用 举例:图G的顶点表示城市,边表示连接两个城市之间的公 路,假设城市之间没有修建任何公路,那么为了把n个城市 连接起来,最多可修建n(n-1)/2条公路,最少可修建n-1条公 路,则图G的生成树表示了修建公路的可行方案。如果考虑 修建造价,那么如何选择n-1条线路,使得修建公路的总造 价最小呢?这就是要构造该图的一棵最小生成树。
遍历结果: V1 V2
V0,V1, V3, V4, V5, V2,V6,V7,V8
注:遍历结果不唯一 注:有点层次遍历的意味
数据结构 励志照亮人生
V5
V0
V3 V6
22
V8
V7
V4
编程改变命运
6.4最小生成树
一、相关概念 1、生成树的定义:连通图G的一个子图如果是一棵包含G
的所有顶点的树。
2、树的权的定义:生成树各边的权值总和。
图是一种m:n(多对多)的关系 。
E={(1,2),(1,3),(2,3),(3,4)}
数据结构 励志照亮人生
E={<1,2>,<1,3>,<3,1>,<3,2>}
编程改变命运 3
6.1 图的概念及相关术语
一、图的概念 2、无向图的定义:每条边都是没有方向的图。 3、有向图的定义:每条边都是有方向的图。
强连通分量
顶点2和1非连通 顶点2和3非连通
数据结构
注:强连通图的强连通分量就是本身。
励志照亮人生 编程改变命运 9
6.1 图的概念及相关术语
二、图的相关术语 8、边的权、网 边的权(Weight)的定义:与边有关的数据为权。权可以 是长度、等级、电流、时间、代价等。 网(Network)的定义:边上带权的图称为网或网络。
子图
子图
数据结构
励志照亮人生
编程改变命运
6
6.1 图的概念及相关术语
二、图的相关术语 5、路径、简单路径和回路 路径的定义:在无向图中,若顶点Vp到顶点Vq存在一个顶 点序列Vp,V1,V2,…,Vi,Vq,使得Vp和顶点Vq相通。 简单路径的定义:若Vp到Vq存在一条路径,除了Vp和Vq可 以相同外,其余顶点均不相同,此路径为一条简单路径。
数据结构
励志照亮人生
编程改变命运
10
6.1 图的概念及相关术语
二、图的相关术语 9、邻接点 在无向图中,若存在一条边(Vi, Vj),则称Vi和Vj互为邻接 点(Adjacent)。 在有向图中,若存在一条弧<Vi, Vj > ,则称Vi为此弧的起点, 称Vj为此弧的终点;称Vi邻接到Vj,Vj邻接自Vi,Vi和Vj互为 邻接点。
顶点到V-U集合中顶点的最小边权值。如果某个顶点已加入
U中,设该顶点对应的下标为j,则用lowcost[j]=0表示。 初始时,假设U={V0},所以lowcost[ 0]=0,其余lowcost[1~n]则 为V0 到其余顶点的边的权值,如果没有边,则其值可用∞表
示,当然∞可以用65535等比较大的数字表示,这个比较大
//定义邻接表数组,AdjList为顶点表结点的数组类型
//(3)定义图
typedef struct { AdjList adjList; //这是一个数组,见上 int numVexs , numEdges; //图的顶点数、图的边数 }GraphAdjList;
数据结构 励志照亮人生 编程改变命运 18
顶点2和3互为邻接点
励志照亮人生
顶点1邻接到顶点2
顶点1和3互为邻接点
数据结构 编程改变命运 11
6.2 图的存储结构
一、邻接矩阵表示法 1、邻接矩阵是表示顶点之间相邻关系的矩阵(二维数组)。
V0
V1 邻接矩阵
V2
V3
0 1 1 0
1 0 1 1
1 1 0 1
0 1 1 0
对称矩阵
邻接矩阵
数据结构
数据结构 励志照亮人生 编程改变命运 23
6.4最小生成树
二、普里姆(Prim)算法 假设图为G=(V,E),V为顶点集合,E为边集合。 (1)选择一个顶点Vi作为源点, 并纳入集合U={Vi},T={}; (2)选择与Vi邻接的顶点中,与Vi构成所有边中权值最小的 顶点Vj并纳入集合U={Vi , Vj},T={Eij}; (3)选择集合U中的顶点与集合V-U 中顶点邻接的边中,权 值最小的顶点Vw,并纳入集合U={Vi , Vj ,Vw}中,T={Eij,Eiw} 或T={Eij,Ejw} ;
数据结构
励志照亮人生
编程改变命运
21
6.3图的遍历
二、广度优先遍历 2、广度优先遍历过程 ①假设图G的初始状态是所有顶点均未曾访问过,在G中 任选一顶点为出发点(源点)。 ②首先将出发点V标记为已访问过,然后依次从V出发搜索 V的每个邻接点W1,W2,…,Wn,再依次访问与W1, W2,…,Wn邻接的所有未曾访问过的顶点,至图中所 有和源点V有路径相通的顶点都已访问到为止。
第6章 图的结构分析与应用
学习目标
了解图的定义及基本术语。 熟练掌握图的邻接矩阵和邻接链表存储方法。
熟练掌握图的深度优先和广度优先遍历。
熟练掌握最小生成树实现方法:普里姆算法(Prim)和克 鲁斯卡尔(Kruskal)算法。 掌握求单源最短路径的迪杰斯特拉(Dijkstra)算法,了解 求每对顶点间最短路径的弗洛伊德(Floyd)算法。 掌握AOE、AOV网概念,掌握拓扑排序,了解关键路径
//typedef int Edge; //边的权值 //(1)定义边表的结点
typedef struct EdgeNode { int adjvex; //邻接点域:存储顶点对应的下标 // Edge info; //存储边的权值 struct EdgeNode *next; //指向下一个邻接点 } EdgeNode; //边表结点
此图为非连通图
连通分量
顶点1和4连通 顶点2和6非连通
数据结构
注:连通图的连通分量就是本身。
励志照亮人生 编程改变命运 8
6.1 图的概念及相关术语
二、图的相关术语 7、强连通图和强连通分量 强连通图的定义:在有向图中任意两个的顶点都连通 。 强连通分量的定义:有向图的极大连通 子图。
此图为非强连通图
的数字可以事先进行预估。
数据结构
励志照亮人生
编程改变命运
25
6.4最小生成树
二、普里姆(Prim)算法 A
4 1 2 8 2 3
B
10 7 4
选择从A点出发。U={A},T={} (1) (2)
顶点 A B C D E F G
C
5
D
E
6

0
2
4
1



U={A,D},T={AD}
顶点 值 A 0 B 2 C 2 D 0 E 7 F 8 G 4
二、邻接表表示法 3、定义:边表结点(单链表) 4、定义:顶点表结点(单链表) 5、封装:图的顶点数、边数
数据结构
励志照亮人生
编程改变命运
16
6.2图的存储结构
一、邻接矩阵表示法 5、图的类型定义 #define MAXVERTEX 100 //顶点数最多100 typedef char Vertex; //顶点定义为字符
励志照亮人生
编程改变命运
12
6.2图的存储结构
一、邻接矩阵表示法 2、顶点存储:需要一个一维数组来完成。
下标 数组Vexs 0 V0 1 V1 2 V2 3 V3
3、边表的存储:需要一个二维数组(见前) 4、顶点数和边数
数据结构
励志照亮人生
编程改变命运
13
6.2图的存储结构
一、邻接矩阵表示法 5、图的类型定义 #define MAXVERTEX 100 //最大顶点个数 #define MAXSIZE 100 //队列最大个数99 typedef char Vertex; //设置顶点类型 typedef int Edge; //设置边类型 typedef struct { Vertex Vexs[MAXVERTEX]; //顶点表 Edge Edges[MAXVERTEX][MAXVERTEX]; int numVexs, numEdges; //顶点个数,边个数 } MGraph; //定义图
遍历结果: V1 V2
V0,V1,V2,V3,V6,V4,V7,V8,V5
注:遍历结果不唯一
回溯 V8
V5
V0
V3 V6
20
V7
V4
数据结构
励志照亮人生
编程改变命运
6.3图的遍历
二、广度优先遍历 1、实例描述:选择从淮安出发, 然后青岛、开封、扬州、 上海、烟台、西安、苏州和大连旅游路线,尽量先旅游附 近的城市,然后逐渐扩大范围。
数据结构 励志照亮人生 编程改变命运
//邻接矩阵,即边表
14
6.2图的存储结构
二、邻接表表示法 1、邻接表表示法类似与树的孩子链表表示法。 2、邻接表的结点结构和数组的结点结构。
adjvex
next
vertex
first
边表数组结构
顶点数组结构
邻接表
数据结构
励志照亮人生
编程改变命运
15
6.2图的存储结构
6.3图的遍历
一、深度优先遍历 1、实例描述:选择从淮安出发,然后青岛、烟台、大连、 西安、开封、上海、苏州和扬州旅游路线,每一条路线尽 量延伸到所有城市。
数据结构
励志照亮人生
编程改变命运
19
6.3图的遍历
一、深度优先遍历 2、深度优先遍历过程 ①假设图G的初始状态是所有顶点均未曾访问过,在G中 任选一顶点为出发点(源点)。 ②首先将出发点V标记为已访问过,然后依次从V出发搜索 V的某个邻接点W,若W未曾访问过,则以W为新的出发 点继续进行深度优先遍历,直至图中所有和源点V有路径 相通的顶点均被访问为止。
F A
1 2
1
G B
U={A,D,B},T={AD,AB}
Βιβλιοθήκη Baidu
C
2
D
(3)
顶点 值
A 0
B 0
C 2
D 0
E 7
F 8
G 4
U={A,D,B,C},T={AD,AB,DC}
数据结构 励志照亮人生 编程改变命运 26
6.4最小生成树
二、普里姆(Prim)算法 A
4 1 2 8 2 3
B
10 7 4
(4)顶点
数据结构
励志照亮人生
编程改变命运
17
6.2图的存储结构
一、邻接矩阵表示法 5、图的类型定义
//(2)定义顶点表的结点
typedef struct VertexNode { Vertex vexs; //顶点域 EdgeNode *first; //指向该顶点的边表的头指针 }VertexNode , AdjList[MAXVERTEX];
数据结构 励志照亮人生 编程改变命运 1
6.1 图的概念及相关术语
零、引 假设6个城市间要铺设光纤,城市间的路径长度如图所示。
数据结构
励志照亮人生
编程改变命运
2
6.1 图的概念及相关术语
一、图的概念 1、图的定义:记为G=(V,E),其中V是顶点的有穷非空集 合,E是边的有穷集合。 V={V0, V1, V2, …Vn-1},Vi顶点的集合,属于某种数据类型。 E={(V0, V2), (V3, V4), … } ,其中“()”可以用“<>” 表示有向边,称为弧。
4、有向图中度的定义:出度是以该顶点为始点的边的数目,
入度是以该顶点为终点的边的数目。
顶点1的度为2 顶点1的出度为2 顶点1的入度为1
数据结构
励志照亮人生
编程改变命运
5
6.1 图的概念及相关术语
二、图的相关术语 4、子图的定义 :若图G=(V,E),G’=(V’,E’),若V’是 V的子集,E’是E的子集,则称图G’是G的一个子图。
相关文档
最新文档