第6章 图—数据结构
计算机导论-第6章 数据结构
单击此处添课程名 ⑵线性结构。该结构的数据元素之间存在着一对一的关系。
⑶树型结构。该结构的数据元素之间存在着一对多的关系。
⑷图型结构。该结构的数据元素之间存在着多对多的关系, 图形结构也称作网状结构。
具有特殊的意义,称为栈顶。相应地,表尾 称为栈底。不含任何元素的栈称为空栈。
2. 栈的数学性质
假设一个栈S中的元素为an,an-1,..,a1,则 称a1为栈底元素,an为栈顶元 素。栈中的
元 时素 候按 ,单出a ,a栈击2,的..此,元an素-处1,都an添是的栈次课顶序程元进素栈名。。换在句任话何
第六章 数单据击结此构处添课程名
第6章 数据结构
• 数据结构是计算机软件和计算机应用专业的 核心课程之一,对于学习计算机专业的其他 课程,如操作系统、编译原理、数据库管理
系的统 。、 数软 据单件 结击工 构程主此、要处人研工究添智数能据课等表程都示是 与名十 存储分的有方益
法、抽象的逻辑结构及其上定义的各种基本 操作。数据的逻辑结构常常采用数学描述的 抽象符号和有关的理论。如使用串、表、数 组、图等结构和理论来表示数据在存储时的 逻辑结构,研究这些结构上定义的各种操作 。
本章内容
• 6.1 数据结构的概念 • 6.2 几种典型的数据结构 • 6.3 查找
• 6.4 单排序击此处添课程名
6.1 数据结构的概念
• 在系统地学习数据结构知识之前,先对一 些与数据结构相关的基本概念和术语赋予 确切的含义。
• 数 算机据单识(别D击at、a此)存是储处信和添息加的工课载处体理程,。名它它能是够计被算计机 程序加工的原料,应用程序处理各种各样 的数据。
数据结构(CC++语言版)第六章new
回路 若路径上第一个顶点 v1 与最后一个顶点vm 重合, 则称这样的路径
为回路或环。
路径长度
非带权图的路径长度是指此路径上边的条数。 带权图的路径长度是指路径上各边的权之和。
▪图的连通 在无向图G中,若两个顶点vi和vj之间有 路径存在,则称vi 和vj 是连通的。若G中任意两 个顶点都是连通的,则称G为连通图。非连通图的 极大连通子图叫做连通分量。
5 9
1
12
63
8
15
76
6
3
4
16
7
60
A
B 40 80 C
30
75
35
D
E
45
▪子图 设有两个图 G=(V, E) 和 G‘=(V’, E‘)。若 V’ V 且 E‘E, 则称 图G’ 是 图G 的子图。
路径 在图 G=(V, E) 中, 若从顶点 vi 出发, 沿一些边经过一些顶点 vp1,
种带权图叫做网。
▪生成树 一个连通图的生成树是它的极小 连通子图,在n个顶点的情形下,有n-1条 边。生成森林
不予讨论的图 包含顶点到其自身的边; 一条边在图中重复出现
6.2 图的存储结构
一. 图的数组表示法 (邻接矩阵表示法)
基本思想:
✓ 图需要存储的信息:顶点和弧。 ✓ 引入两个数组,一个记录各个顶点信息的顶点表,还
有一个表示各个顶点之间关系的邻接矩阵。
设图 A = (V, E)是一个有 n 个顶点的图,则图的 邻接矩阵是一个二维数组 A.arcs[n][n],定义:
1 arcs[i][j] = 0
若<vi, vj> 或 (vi, vj) E 反之
2
1
数据结构第六章 哈夫曼树
6.3哈夫曼树6.3.1基本术语1.路径和路径长度若在一棵中存在着一个结点序列k1 ,k2,…,kj,使得ki是k1+i 的双亲(1ji<≤),则称此结点序列是从k1~kj的路径,因树中每个结点只有一个双亲结点,所以它也是这两个结点之间k 1~kj所经过的分支数称为这两点之间的路径长度,它等于路径上的结点数减1(实际就是边数)。
如在图5-19(a)所示的二叉树中,从树根结点L到叶子结点P的路径为结点序列L、M、S、P,路径长度为3。
(a) (b)(c) (d)图5-19 二叉排序树的删除2.结点的权和带权路径长度在许多应用中,常常将树中的结点赋上一个有着某种意义的实数,我们称此实数为该结点的权。
结点的带权路径长度规定为从树根结点到该结点之间的路径长度与该结点上权的乘积3.树的带权路径长度树的带权路径长度定义为树中所有叶子结点的带权路径长度这和,通常记为:2 WPL = ∑=n i i i lw 1其中n 表示叶子结点的数目,i w 和i l 分别表示叶子结点i k 的权值和根到i k 之间的路径长度 。
4.哈夫曼树哈夫曼(Huffman)树又称最优二叉树。
它是n 个带权叶子结点构成的所有二叉树中,带权路径长度 WPL 最小的二叉树。
因为构造这种树的算法是最早由哈夫曼于1952年提出的,所以被称之为哈夫曼树。
例如,有四个叶子结点a 、b 、c 、d ,分别带权为9、4、5、2,由它们构成的三棵不同的二叉树(当然还有其它许多种)分别如图5-20(a)到图5-20(c)所示。
b ac a b cd d c a b d(a) (b) (c)图5-20 由四个叶子结点构成的三棵不同的带权二叉树 每一棵二叉树的带权路径长度WPL 分别为:(a) WPL = 9×2 + 4×2 + 5×2 + 2×2 = 40(b) WPL = 4×1 + 2×2 + 5×3 + 9×3 = 50(c) WPL = 9×1 + 5×2 + 4×3 + 2×3 = 37其中图5-20(c)树的WPL 最小,稍后便知,此树就是哈夫曼树。
北邮数据结构第六章答案详解 图(1)
1
5
1
54 3
42
5 66
图 6-8 图 G 答案:根据不同算法构造的最小生成树如图 6-9 所示的图(a)和(b)
2
④
⑤ 5
1
①
4 3
②
③
6
2
⑤
③ 5
1
①
4 3
④
②
6
(a) Prim 生成树
(b) Kruskal 生成树
图 6-9 最小生成树
5、算法设计
(1)以邻接表为存储结构,设计实现深度优先遍历的非递归算法。
int top = -1; cout<<v<<’\t’; bVisited[v] = true; stack[++top] = v;
//访问结点 v //设置访问标记 //结点 v 入栈
while (top!=-1)
{
v=stack[top];
ArcNode<T> *p = adjlist[v]. firstarc; ①
)
A.1
B. n/2
C.n-1
D.n
解析:若超过 n-1,则路径中必存在重复的顶点
答案:C
(5) 若一个图中包含有 k 个连通分量,若按照深度优先搜索的方法访问所有顶点,则必
须调用(
)次深度优先搜索遍历的算法。
A.k
B.1
C.k-1
D.k+1
解析:一次深度优先搜索可以访问一个连通分量中的所有结点,因此 k 个连通分量需要 调用 k 次深度优先遍历算法。
④
} if (p==NULL) top--;
⑤//若是找不到未访问的结点,出栈
《数据结构(C语言版 第2版)》(严蔚敏 著)第六章练习题答案
《数据结构(C语言版第2版)》(严蔚敏著)第六章练习题答案第6章图1.选择题(1)在一个图中,所有顶点的度数之和等于图的边数的()倍。
A.1/2B.1C.2D.4答案:C(2)在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的()倍。
A.1/2B.1C.2D.4答案:B解释:有向图所有顶点入度之和等于所有顶点出度之和。
(3)具有n个顶点的有向图最多有()条边。
A.n B.n(n-1)C.n(n+1)D.n2答案:B解释:有向图的边有方向之分,即为从n个顶点中选取2个顶点有序排列,结果为n(n-1)。
(4)n个顶点的连通图用邻接距阵表示时,该距阵至少有()个非零元素。
A.n B.2(n-1)C.n/2D.n2答案:B所谓连通图一定是无向图,有向的叫做强连通图连通n个顶点,至少只需要n-1条边就可以了,或者说就是生成树由于无向图的每条边同时关联两个顶点,因此邻接矩阵中每条边被存储了两次(也就是说是对称矩阵),因此至少有2(n-1)个非零元素(5)G是一个非连通无向图,共有28条边,则该图至少有()个顶点。
A.7B.8C.9D.10答案:C解释:8个顶点的无向图最多有8*7/2=28条边,再添加一个点即构成非连通无向图,故至少有9个顶点。
(6)若从无向图的任意一个顶点出发进行一次深度优先搜索可以访问图中所有的顶点,则该图一定是()图。
A.非连通B.连通C.强连通D.有向答案:B解释:即从该无向图任意一个顶点出发有到各个顶点的路径,所以该无向图是连通图。
(7)下面()算法适合构造一个稠密图G的最小生成树。
A.Prim算法B.Kruskal算法C.Floyd算法D.Dijkstra算法答案:A解释:Prim算法适合构造一个稠密图G的最小生成树,Kruskal算法适合构造一个稀疏图G的最小生成树。
(8)用邻接表表示图进行广度优先遍历时,通常借助()来实现算法。
A.栈 B.队列 C.树D.图答案:B解释:广度优先遍历通常借助队列来实现算法,深度优先遍历通常借助栈来实现算法。
6-1-数据结构——从概念到C++实现(第3版)-王红梅-清华大学出版社
6-1 图的提出
七巧板涂色问题
【问题】假设有下图所示七巧板,使用至多 4 种不同颜色对七巧板涂色,要求 每个区域涂一种颜色,相邻区域的颜色互不相同。求涂色方案。
【想法——数据模型】将七巧板的每个区域看成一个顶点,如果两个区域相邻,
数
则这两个顶点之间有边相连,从而将七巧板抽象为图结构。
据 结
念 到
实
现
)
清
【问题】排课问题。教室构成一
A
E
F
华 大 学
组顶点,课程构成一组顶点,如
V1={A, E, F}
出 版 社
果A教室可以安排B课程,则顶点
V2={B, C, D}
A和B之间有一条边。
B
C
D
农夫过河问题
【问题】农夫过河问题。一个农夫带着一只狼、一只羊和一筐菜,想从河一边
(左岸)乘船到另一边(右岸),由于船太小,农夫每次只能带一样东西过河,
先修课程
结 构
(
c1
程序设计基础
无
c2
电子技术基础
无
c3
离散数学
c1
c4
数据结构
c1
从
概
c3
c8
念 到 实
现
c1
) 清
华
c4
c6
大 学 出
版
c5
计算机原理
c1 c2
社
c6
操作系统
c3 c4 c5
c2
c5
c7
c7
计算机网络
c4 c5 c6
c8
数据库原理及应用 c4 c5
社交网络
数 据 结 构 ( 从 概 念 到 实 现 ) 清 华 大 学 出 版 社
数据结构第六章图理解练习知识题及答案解析详细解析(精华版)
图1. 填空题⑴设无向图G中顶点数为n,则图G至少有()条边,至多有()条边;若G为有向图,则至少有()条边,至多有()条边。
【解答】0,n(n-1)/2,0,n(n-1)【分析】图的顶点集合是有穷非空的,而边集可以是空集;边数达到最多的图称为完全图,在完全图中,任意两个顶点之间都存在边。
⑵任何连通图的连通分量只有一个,即是()。
【解答】其自身⑶图的存储结构主要有两种,分别是()和()。
【解答】邻接矩阵,邻接表【分析】这是最常用的两种存储结构,此外,还有十字链表、邻接多重表、边集数组等。
⑷已知无向图G的顶点数为n,边数为e,其邻接表表示的空间复杂度为()。
【解答】O(n+e)【分析】在无向图的邻接表中,顶点表有n个结点,边表有2e个结点,共有n+2e个结点,其空间复杂度为O(n+2e)=O(n+e)。
⑸已知一个有向图的邻接矩阵表示,计算第j个顶点的入度的方法是()。
【解答】求第j列的所有元素之和⑹有向图G用邻接矩阵A[n][n]存储,其第i行的所有元素之和等于顶点i的()。
【解答】出度⑺图的深度优先遍历类似于树的()遍历,它所用到的数据结构是();图的广度优先遍历类似于树的()遍历,它所用到的数据结构是()。
【解答】前序,栈,层序,队列⑻对于含有n个顶点e条边的连通图,利用Prim算法求最小生成树的时间复杂度为(),利用Kruskal 算法求最小生成树的时间复杂度为()。
【解答】O(n2),O(elog2e)【分析】Prim算法采用邻接矩阵做存储结构,适合于求稠密图的最小生成树;Kruskal算法采用边集数组做存储结构,适合于求稀疏图的最小生成树。
⑼如果一个有向图不存在(),则该图的全部顶点可以排列成一个拓扑序列。
【解答】回路⑽在一个有向图中,若存在弧、、,则在其拓扑序列中,顶点vi, vj, vk的相对次序为()。
【解答】vi, vj, vk【分析】对由顶点vi, vj, vk组成的图进行拓扑排序。
数据结构与算法-第6章
如果 e=(u, v) 是 E(G) 中的一条边,则称 u 与 v
互为邻接点或相邻点;称边e与顶点u,v关联;
如果 a=<u, v> 是 E(G) 中的一条弧,则称u邻接到v
或v邻接于u,也称弧a与顶点u,v关联.
9
6.1 图的基本概念
顶点的度(与树中结点的度不同): –无向图中,顶点的度是与每个顶点关联的边数, 记作TD(v) –有向图中,顶点的度分成入度与出度 •入度:以该顶点为终头的弧的数目,记为ID(v) •出度:以该顶点为始点的弧的数目,记为OD(v) 一个顶点的度等于该顶点的入度与出度之和,即 TD(v)=OD(v)+ID(v)
20
带权图的邻接矩阵
wij 若(vi,vj)∈E或<vi,vj>∈E
A[i][j]= ∞ 其它 0 i=j
21
用邻接矩阵表示的图的类的定义
class AdjMatrix { int n; int matrix[MaxSize][ MaxSize]; public: AdjMatrix(int m) { n=m; } }; // AdjMatrix class AdjMatrix { const int INFINITE=∞; int n; float matrix[MaxSize][MaxSize]; public: AdjMatrix(int m) { n=m;} }; // AdjMatrix // 非带权图 // 顶点的个数 // 邻接矩阵
回路——第一个顶点和最后一个顶点相同的路径。
简单回路——除了第一个顶点和最后一个顶点外,其
余顶点不重复出现的回路。
11
6.1 图的基本概念
V0V1V3V2
V0V1V3V0V1V2
数据结构_第六章_图_练习题与答案详细解析(精华版)
图1. 填空题⑴ 设无向图G中顶点数为n,则图G至少有()条边,至多有()条边;若G为有向图,则至少有()条边,至多有()条边。
【解答】0,n(n-1)/2,0,n(n-1)【分析】图的顶点集合是有穷非空的,而边集可以是空集;边数达到最多的图称为完全图,在完全图中,任意两个顶点之间都存在边。
⑵ 任何连通图的连通分量只有一个,即是()。
【解答】其自身⑶ 图的存储结构主要有两种,分别是()和()。
【解答】邻接矩阵,邻接表【分析】这是最常用的两种存储结构,此外,还有十字链表、邻接多重表、边集数组等。
⑷ 已知无向图G的顶点数为n,边数为e,其邻接表表示的空间复杂度为()。
【解答】O(n+e)【分析】在无向图的邻接表中,顶点表有n个结点,边表有2e个结点,共有n+2e个结点,其空间复杂度为O(n+2e)=O(n+e)。
⑸ 已知一个有向图的邻接矩阵表示,计算第j个顶点的入度的方法是()。
【解答】求第j列的所有元素之和⑹ 有向图G用邻接矩阵A[n][n]存储,其第i行的所有元素之和等于顶点i的()。
【解答】出度⑺ 图的深度优先遍历类似于树的()遍历,它所用到的数据结构是();图的广度优先遍历类似于树的()遍历,它所用到的数据结构是()。
【解答】前序,栈,层序,队列⑻ 对于含有n个顶点e条边的连通图,利用Prim算法求最小生成树的时间复杂度为(),利用Kruskal 算法求最小生成树的时间复杂度为()。
【解答】O(n2),O(elog2e)【分析】Prim算法采用邻接矩阵做存储结构,适合于求稠密图的最小生成树;Kruskal算法采用边集数组做存储结构,适合于求稀疏图的最小生成树。
⑼ 如果一个有向图不存在(),则该图的全部顶点可以排列成一个拓扑序列。
【解答】回路⑽ 在一个有向图中,若存在弧、、,则在其拓扑序列中,顶点vi, vj, vk的相对次序为()。
【解答】vi, vj, vk【分析】对由顶点vi, vj, vk组成的图进行拓扑排序。
《数据结构图》课件
欢迎来到《数据结构图》PPT课件!本课程将带您深入了解数据结构的定义、 常见类型以及应用领域。让我们一起开始探索这个精彩的主题吧!
概述
通过本节课,您将了解到数据结构的基本概念和作用。我们将探讨如何存储 和组织数据以及优化数据访问和操作的方法。
数据结构的定义
在这一节中,我们将介绍数据结构的定义,并探讨数据的抽象和表示方法。 了解数据结构的定义将有助于您理解数据在计算机中的常重要,因为不同的数据结构适用于不同的场景和数据操作需求。本节将深入 研究线性结构、树形结构和图形结构。
线性结构
线性结构是最简单且最常见的数据结构类型之一。我们将研究数组、链表和 栈等线性结构的特点、优点和缺点,并了解它们在实际应用中的使用情况。
树形结构
树形结构是一种层次化的数据结构,常用于表示层级关系。本节我们将探讨 二叉树、堆和AVL树等树形结构,并讨论它们在数据处理和搜索中的应用。
图形结构
图形结构是一种包含节点和边的数据结构,用于表示复杂的关联关系。本节我们将深入研究图的定义、遍历算 法和最短路径算法,并讨论图形结构在社交网络和地图导航中的应用。
数据结构的应用
数据结构是计算机科学领域中的核心概念,几乎应用于所有的软件开发领域。 本节我们将探讨数据结构在数据库、图形处理和算法设计中的实际应用。
数据结构图的设计原则
了解数据结构图的设计原则有助于我们创建清晰、易于理解的数据结构图。 本节我们将讨论数据结构图的设计原则,例如模块化、抽象和简洁性。
数据结构 第6章 图
数据结构第6章图在计算机科学中,数据结构是组织和存储数据的方式,以便能够有效地进行操作和访问。
而图,作为数据结构中的一个重要概念,在解决许多实际问题中发挥着关键作用。
图是由一组顶点和一组连接这些顶点的边所组成。
顶点可以表示各种实体,比如城市、人、网页等等;边则表示顶点之间的关系,比如城市之间的道路连接、人与人之间的社交关系、网页之间的链接。
从形式上看,图可以分为无向图和有向图。
无向图中,边没有方向,也就是说,如果顶点 A 和顶点 B 之间有一条边,那么从 A 能到达 B,从 B 也能到达 A。
而在有向图中,边是有方向的,比如从顶点 A 指向顶点 B 的边,意味着只能从 A 到达 B,而不能反过来。
图的存储方式有多种,常见的有邻接矩阵和邻接表。
邻接矩阵是一个二维数组,如果顶点 i 和顶点 j 之间有边相连,那么数组中的第 i 行第 j 列和第 j 行第 i 列(对于无向图)或者第 i 行第 j 列(对于有向图)的值为 1,否则为 0。
邻接矩阵的优点是查询边的存在与否非常快速,但缺点是对于稀疏图(边的数量相对顶点数量较少的图)会浪费大量的存储空间。
邻接表则是为每个顶点建立一个链表,链表中存储与该顶点相邻的其他顶点。
这种方式对于稀疏图来说,能够节省大量的存储空间,但在查询边的存在时可能相对较慢。
在对图进行操作时,遍历是一个重要的算法。
常见的图遍历算法有深度优先遍历和广度优先遍历。
深度优先遍历就像是在一个迷宫中,选择一条路一直走到底,直到走不通了再回溯。
具体来说,从一个起始顶点开始,先访问该顶点,然后递归地访问其未被访问过的相邻顶点。
这种遍历方式能够深入探索图的结构,但可能会导致某些部分的图被较晚访问到。
广度优先遍历则像是以起始顶点为中心,逐层向外扩展访问。
首先访问起始顶点,然后依次访问其所有相邻顶点,再依次访问这些相邻顶点的相邻顶点,以此类推。
这种遍历方式能够先访问距离起始顶点较近的顶点。
图在实际应用中有着广泛的用途。
第6章 图4-算法与数据结构(第三版)-陈媛-清华大学出版社
计算机科学与工程学院《数据结构》课程组
6
Dijkstra算法
S←{v1}; dist[j]←cost[1,j] j=2,...,n; 选择vj使得 dist[j]=min{dist[i]│vi∈V-S} vj就是当前求得的一条从v1出发的最短路径的终 点。令:S=S∪{j} 修改从v1出发到集合V-S上任一个顶点Vk可达的 最短路径长度,如果dist[j]+cost[j,k]<dist[k], 则修改dist[k]为dist[k]=dist[j]+cost[j,k] 重复(2)、(3)共n-1次,由此求得从v到图上其余各 顶点的最短路径是依路径长度递增的序列 时间复杂度为O(n2)
20
计算机科学与工程学院《数据结构》课程组
3
单源最短路径-迪杰斯特拉(Dijkstra)算法思想
按路径长度递增次序产生最短路径算法: 把V分成两组:
S:已求出最短路径的顶点的集合 V-S=T:尚未确定最短路径的顶点集合 将T中顶点按最短路径递增的次序加入到S中, 保证: 从源点V0到S中各顶点的最短路径长度都不大于 从V0到T中任何顶点的最短路径长度 每个顶点对应一个距离值
计算机科学与工程学院《数据结构》课程组
王道数据结构 第六章 图思维导图
ve(源点)=0
ve(k)
=
Ma
x{ve(j)+Weight(vj
v, k )},vj
v 为
k
的任意前驱
1.求所有事件的最早发生时间ve()
按逆拓扑排序序列,依次求各个顶点的vl(k):
vl(汇点)=ve(汇点)
vl(k)
=
Min{vl(j)-W
eight(vj
v, k )},vj
常见考点:
对于n个顶点的无向图G,
若G是连通图,则最少有n
-1条边,
若G是非连通图,则最多可能有Cn2−
1
条边
对于n个顶点的有向图G,
若G是强连通图,则最少有
n条边
子图/生成子图(子图包括所有顶点)
强连通分量:有向图中的极大强连通子图(必须强连通且保留尽可能多的边)
连通图的生成树是包含图中全部顶点的一个极小连通子图(边尽可能的少但要保 持连通)
n个顶点对应2Cn2
条边
几种特殊的图
稀疏图/稠密图 树:不存在回路,且连通的无向图
n个顶点的树必有n-1条边 常见考点:n个顶点的图,若|E|>n-1,则图中一定存在回路
有向树:一个顶点的入度为0,其余顶点的入度均为1的有向图
有向树不是强连通图
常见考点
邻接矩阵
图的存储
无向图
第i个结点的度 = 第i行(或第i列)的非零元素个数
每一轮时间复杂度:O(2n)
时间复杂度
最短路径问题
Dijkstra算法不适用于有负权值的带权图 算法思想:动态规划
Floyd算法(带权图,无权图)
各顶点间的最短路径
数据结构图资料课件
根据给定的权值集合构建哈夫曼树的详细步骤和代码实现。
PART 04
图形结构图资料
图的基本概念和术语解释
图(Graph)
无向图和有向图
由顶点(Vertex)和边(Edge)组成的数据结构, 用于表示对象及其之间的关系。
根据边是否有方向,图可分为无向图和有 向图。无向图中的边没有方向,而有向图 中的边有方向。
ONE
KEEP VIEW
数据结构图资料课件
目 录
• 数据结构图基本概念 • 线性结构图资料
• 查找与排序相关知识点 • 数据结构图在实际问题中应用
PART 01
数据结构图基本概念
数据结构定义与分类
数据结构定义
数据结构是计算机存储、组织数 据的方式,包括数据的逻辑结构、 存储结构和运算三部分。
数据结构分类
常见查找排序算法代码示例
二分查找代码示例
通过不断缩小查找 范围,快速定位元 素位置。
插入排序代码示例
通过构建有序序列, 逐个插入元素并保 持有序性。
顺序查找代码示例
通过循环遍历数组, 逐个比较元素值。
哈希查找代码示例
设计哈希函数计算 关键字存储位置, 处理哈希冲突。
快速排序代码示例
选取基准元素,将 序列划分为两部分 并递归排序。
PART 06
数据结构图在实际问题中 应用
实际问题中数据结构选择策略
选择合适的数据结构
01
根据问题的特点,选择合适的数据结构,如数组、链表、栈、
队列、树、图等。
考虑数据规模
02
针对数据规模的大小,选择合适的数据结构以优化时间和空间
复杂度。
利用数据结构特性
03
第6章 图3-算法与数据结构(第三版)-陈媛-清华大学出版社
12
PRIM算法
✓ 初始为任意一个顶点,置初始候选蓝边集 ✓ While(T中顶点数目<n) ✓{
✓ 从候选蓝边集合中选取最短蓝边(u,v); ✓ 将边(u,v)及结点涂成红色,扩充到T中; ✓ 调整候选蓝边集; ✓}
13
PRIM算法数据结构
✓ int dist[n][n]; //网络的邻接矩阵
✓ typedef struct ✓{
✓ int from,end; //边的起点和终点 ✓ int length; //边的权值 ✓ }edge; //边结构
✓ edge T[n-1]; //图的生成树
14
15
最小生成树——克鲁斯卡尔(Kruskal)算法
✓ 算法 ✓ 设连通网N={V,E}, ✓ 令最小生成树的初始状态为 ✓ 有n个顶点,无边的非连通图T=(V,Φ) ✓ 图中每一个顶点自成一个连通分量 ✓ 在E中选择权最小的边 ✓ 若此边依附的顶点落在T的不同的连通分量上,则将此边加入 到T中 ✓ 该边的加入将使两个连通分量合成一个连通分量 ✓ 否则该边的加入必然出现回路,所以舍去此边,选择下一条 代价最小的边 ✓ 依此类推,直到T 中所有顶点在同一连通分量上
✓ n个城市间建立通信网,只需n-1条线路 ✓ 如何在可能的线路中选择n-1条边,把所有城
市连起来,且总耗费(各边权值之和)最小 ✓ 找图中的最小生成树
8
PRIM算法
✓ 贪心法 ✓ 旅行推销员(TSP)问题
✓ 推销员从其中某一城市出发,唯一走遍n个城市, 再回到出发的城市,求最短的路线
✓ 在带权无向完全图中,访问每个顶点恰好一次、并且返 回出发点、总权数最小的回路
(d)
17
练习题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//(3)定义图
typedef struct { AdjList adjList; //这是一个数组,见上 int numVexs , numEdges; //图的顶点数、图的边数 }GraphAdjList;
数据结构 励志照亮人生 编程改变命运 18
简单回路或简单环的定义:起点与终点相同的简单路径。
简单环 简单路径 路径1、3、2、4
数据结构
励志照亮人生
编程改变命运
7
6.1 图的概念及相关术语
二、图的相关术语 6、连通、连通图、连通分量 连通的定义:若从一个顶点到另一个顶点互有路径。 连通图的定义:无向图中任意两顶点连通。 连通分量的定义:无向图的极大连通子图(连通且子图)。
数据结构
励志照亮人生
编程改变命运
17
6.2图的存储结构
一、邻接矩阵表示法 5、图的类型定义
//(2)定义顶点表的结点
typedef struct VertexNode { Vertex vexs; //顶点域 EdgeNode *first; //指向该顶点的边表的头指针 }VertexNode , AdjList[MAXVERTEX];
遍历结果: 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、树的权的定义:生成树各边的权值总和。
6.3图的遍历
一、深度优先遍历 1、实例描述:选择从淮安出发,然后青岛、烟台、大连、 西安、开封、上海、苏州和扬州旅游路线,每一条路线尽 量延伸到所有城市。
数据结构
励志照亮人生
编程改变命运
19
6.3图的遍历
一、深度优先遍历 2、深度优先遍历过程 ①假设图G的初始状态是所有顶点均未曾访问过,在G中 任选一顶点为出发点(源点)。 ②首先将出发点V标记为已访问过,然后依次从V出发搜索 V的某个邻接点W,若W未曾访问过,则以W为新的出发 点继续进行深度优先遍历,直至图中所有和源点V有路径 相通的顶点均被访问为止。
顶点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
对称矩阵
邻接矩阵
数据结构
此图为非连通图
连通分量
顶点1和4连通 顶点2和6非连通
数据结构
注:连通图的连通分量就是本身。
励志照亮人生 编程改变命运 8
6.1 图的概念及相关术语
二、图的相关术语 7、强连通图和强连通分量 强连通图的定义:在有向图中任意两个的顶点都连通 。 强连通分量的定义:有向图的极大连通 子图。
此图为非强连通图
子图
子图
数据结构
励志照亮人生
编程改变命运
6
6.1 图的概念及相关术语
二、图的相关术语 5、路径、简单路径和回路 路径的定义:在无向图中,若顶点Vp到顶点Vq存在一个顶 点序列Vp,V1,V2,…,Vi,Vq,使得Vp和顶点Vq相通。 简单路径的定义:若Vp到Vq存在一条路径,除了Vp和Vq可 以相同外,其余顶点均不相同,此路径为一条简单路径。
第6章 图的结构分析与应用
学习目标
了解图的定义及基本术语。 熟练掌握图的邻接矩阵和邻接链表存储方法。
熟练掌握图的深度优先和广度优先遍历。
熟练掌握最小生成树实现方法:普里姆算法(Prim)和克 鲁斯卡尔(Kruskal)算法。 掌握求单源最短路径的迪杰斯特拉(Dijkstra)算法,了解 求每对顶点间最短路径的弗洛伊德(Floyd)算法。 掌握AOE、AOV网概念,掌握拓扑排序,了解关键路径
励志照亮人生
编程改变命运
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; //定义图
顶点到V-U集合中顶点的最小边权值。如果某个顶点已加入
U中,设该顶点对应的下标为j,则用lowcost[j]=0表示。 初始时,假设U={V0},所以lowcost[ 0]=0,其余lowcost[1~n]则 为V0 到其余顶点的边的权值,如果没有边,则其值可用∞表
示,当然∞可以用65535等比较大的数字表示,这个比较大
数据结构
励志照亮人生
编程改变命运
21
6.3图的遍历
二、广度优先遍历 2、广度优先遍历过程 ①假设图G的初始状态是所有顶点均未曾访问过,在G中 任选一顶点为出发点(源点)。 ②首先将出发点V标记为已访问过,然后依次从V出发搜索 V的每个邻接点W1,W2,…,Wn,再依次访问与W1, W2,…,Wn邻接的所有未曾访问过的顶点,至图中所 有和源点V有路径相通的顶点都已访问到为止。
强连通分量
顶点2和1非连通 顶点2和3非连通
数据结构
注:强连通图的强连通分量就是本身。
励志照亮人生 编程改变命运 9
6.1 图的概念及相关术语
二、图的相关术语 8、边的权、网 边的权(Weight)的定义:与边有关的数据为权。权可以 是长度、等级、电流、时间、代价等。 网(Network)的定义:边上带权的图称为网或网络。
//typedef int Edge; //边的权值 //(1)定义边表的结点
typedef struct EdgeNode { int adjvex; //邻接点域:存储顶点对应的下标 // Edge info; //存储边的权值 struct EdgeNode *next; //指向下一个邻接点 } EdgeNode; //边表结点
数据结构 励志照亮人生 编程改变命运 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} ;
二、邻接表表示法 3、定义:边表结点(单链表) 4、定义:顶点表结点(单链表) 5、封装:图的顶点数、边数
数据结构
励志照亮人生
编程改变命运
16
6.2图的存储结构
一、邻接矩阵表示法 5、图的类型定义 #define MAXVERTEX 100 //顶点数最多100 typedef char Vertex; //顶点定义为字符
数据结构 励志照亮人生 编程改变命运 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), … } ,其中“()”可以用“<>” 表示有向边,称为弧。
图是一种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、有向图的定义:每条边都是有方向的图。
遍历结果: V1 V2
V0,V1,V2,V3,V6,V4,V7,V8,V5
注:遍历结果不唯一
回溯 V8
V5
V0
V3 V6
20
V7
V4
数据结构
励志照亮人生
编程改变命运
6.3图的遍历
二、广度优先遍历 1、实例描述:选择从淮安出发, 然后青岛、开封、扬州、 上海、烟台、西安、苏州和大连旅游路线,尽量先旅游附 近的城市,然后逐渐扩大范围。
(4)重复第三步,直到U中包含所有顶点,此时U=V,E 中必有n-1条边(图G有n个顶点)
注:步骤3保证了生成树不会出现回路,因为两个顶点的 集合U和V-U,正好其顶点互不相同。