数据结构第七章图(2016)
数据结构第七章-图

*
V0
V7
V6
V5
V4
V3
V2
V1
若图的存储结构为邻接表,则 访问邻接点的顺序不唯一, 深度优先序列不是唯一的
V0
V1
V3
V2
V7
V6
V5
V4
V0,V1,V3,V4,V7,V2,V5,V6,
※求图G以V0为起点的的深度优先序列(设存储结构为邻接矩阵)
void DFSAL(ALGraph G, int i) {/*从第v个顶点出发,递归地深度优先遍历图G*/ /* v是顶点的序号,假设G是用邻接表存储*/ EdgeNode *p; int w; visited[i] =1; Visit(i); /*访问第v个顶点*/ for (p=G.vertices[i].firstarc;p;p=p->nextarc) {w=p->adjvex; /*w是v的邻接顶点的序号*/ if (!visited[w]) DFSAL(G, w); /*若w尚未访问, 递归调用DFS*/ } }/*DFSAL*/
在邻接表存储结构上的广度优先搜索
*
Q
V0
V1
V2
V3
V4
V7
V5
V6
V1
V2
V3
V0
V4
V7
V5
V6
V0
V7
V6
V5
V4
V3
V2
V1
7.3 图的遍历
7
0
1
2
V0
V2
V3
V1
data
firstarc
0
1
^
^
adjvex
next
3
第7章图_数据结构

v4
11
2013-8-7
图的概念(3)
子图——如果图G(V,E)和图G’(V’,E’),满足:V’V,E’E 则称G’为G的子图
2 1 4 3 5 6 3 5 6 1 2
v1 v2 v4 v3 v2
v1 v3 v4
v3
2013-8-7
12
图的概念(4)
路径——是顶点的序列V={Vp,Vi1,……Vin,Vq},满足(Vp,Vi1),
2013-8-7 5
本章目录
7.1 图的定义和术语 7.2 图的存储结构
7.2.1 数组表示法 7.2.2 邻接表 ( *7.2.3 十字链表 7.3.1 深度优先搜索 7.3.2 广度优先搜索 7.4.1 图的连通分量和生成树 7.4.2 最小生成树
*7.2.4 邻接多重表 )
7.3 图的遍历
连通树或无根树
无回路的图称为树或自由树 或无根树
2013-8-7
18
图的概念(8)
有向树:只有一个顶点的入度为0,其余 顶点的入度为1的有向图。
V1 V2
有向树是弱 连通的
V3
V4
2013-8-7
19
自测题
7. 下列关于无向连通图特性的叙述中,正确的是
2013-8-7
29
图的存贮结构:邻接矩阵
若顶点只是编号信息,边上信息只是有无(边),则 数组表示法可以简化为如下的邻接矩阵表示法: typedef int AdjMatrix[MAXNODE][MAXNODE];
*有n个顶点的图G=(V,{R})的邻接矩阵为n阶方阵A,其定 义如下:
1 A[i ][ j ] 0
【北方交通大学 2001 一.24 (2分)】
数据结构--图---作业及部分答案

数据结构习题第七章图一、选择题1、一个有n个顶点的无向图最多有( C )条边。
A、nB、n(n-1)C、n(n-1)/2D、2n2、具有4个顶点的无向完全图有( A )条边。
A、6B、12C、16D、203、具有6个顶点的无向图至少有( A )条边才能保证是一个连通图。
A、5B、6C、7D、84、设连通图G的顶点数为n,则G的生成树的边数为( A )。
A、n-1B、nC、2nD、2n-15、已知一个图,若从顶点a出发进行深度和广度优先搜索遍历,则可能得到的顶点序列分别为( D )和(B )(1)A、abecdf B、acfebd C、acebfd D、acfdeb(2)A、abcedf B、abcefd C、abedfc D、acfdeb6、采用邻接表存储的图的深度和广度优先搜索遍历算法类似于二叉树的( B )和( D )。
A、中序遍历B、先序遍历C、后序遍历D、层次遍历7、已知一有向图的邻接表存储结构如下图所示,分别根据图的深度和广度优先搜索遍历算法,从顶点v1出发,得到的顶点序列分别为( C )和( B )。
A、v1,v2,v3,v4,v5B、v1,v3,v2,v4,v5C、v1,v2,v3,v5,v4D、v1,v4,v3,v5,v28、已知一个图如下,在该图的最小生成树中各边上权值之和为( C ),在该图的最小生成树中,从v1到v6的路径为(G )。
A、31B、38C、36D、43E、v1,v3,v6F、v1,v4,v6G、v1,v5,v4,v6H、v1,v4,v3,v69、正确的AOE网必须是(C )A、完全图B、哈密尔顿图C、无环图D、强连通图10、已知一个图如下,则由该图得到的一种拓扑序列为( A )。
A、v1,v4,v6,v2,v5,v3B、v1,v2,v3,v4,v5,v6C、v1,v4,v2,v3,v6,v5D、v1,v2,v4,v6,v3,v511、下面结论中正确的是( B )A、在无向图中,边的条数是顶点度数之和。
数据结构第7章习题答案

第7章 《图》习题参考答案一、单选题(每题1分,共16分)( C )1. 在一个图中,所有顶点的度数之和等于图的边数的倍。
A .1/2 B. 1 C. 2 D. 4 (B )2. 在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的倍。
A .1/2 B. 1 C. 2 D. 4 ( B )3. 有8个结点的无向图最多有条边。
A .14 B. 28 C. 56 D. 112 ( C )4. 有8个结点的无向连通图最少有条边。
A .5 B. 6 C. 7 D. 8 ( C )5. 有8个结点的有向完全图有条边。
A .14 B. 28 C. 56 D. 112 (B )6. 用邻接表表示图进行广度优先遍历时,通常是采用来实现算法的。
A .栈 B. 队列 C. 树 D. 图 ( A )7. 用邻接表表示图进行深度优先遍历时,通常是采用来实现算法的。
A .栈 B. 队列 C. 树 D. 图( C )8. 已知图的邻接矩阵,根据算法思想,则从顶点0出发按深度优先遍历的结点序列是( D )9. 已知图的邻接矩阵同上题8,根据算法,则从顶点0出发,按深度优先遍历的结点序列是A . 0 2 4 3 1 5 6 B. 0 1 3 5 6 4 2 C. 0 4 2 3 1 6 5 D. 0 1 23465 ( D )10. 已知图的邻接表如下所示,根据算法,则从顶点0出发按深度优先遍历的结点序列是( A )11. 已知图的邻接表如下所示,根据算法,则从顶点0出发按广度优先遍历的结点序列是A .0 2 4 3 1 5 6B. 0 1 3 6 5 4 2C. 0 1 3 4 2 5 6D. 0 3 6 1 5 4 2⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡0100011101100001011010110011001000110010011011110A .0 1 3 2 B. 0 2 3 1 C. 0 3 2 1 D. 0 1 2 3A.0 3 2 1 B. 0 1 2 3C. 0 1 3 2D. 0 3 1 2(A)12. 深度优先遍历类似于二叉树的A.先序遍历 B. 中序遍历 C. 后序遍历 D. 层次遍历(D)13. 广度优先遍历类似于二叉树的A.先序遍历 B. 中序遍历 C. 后序遍历 D. 层次遍历(A)14. 任何一个无向连通图的最小生成树A.只有一棵 B. 一棵或多棵 C. 一定有多棵 D. 可能不存在(注,生成树不唯一,但最小生成树唯一,即边权之和或树权最小的情况唯一)二、填空题(每空1分,共20分)1. 图有邻接矩阵、邻接表等存储结构,遍历图有深度优先遍历、广度优先遍历等方法。
数据结构课后习题答案第七章

第七章图(参考答案)7.1(1)邻接矩阵中非零元素的个数的一半为无向图的边数;(2)A[i][j]= =0为顶点,I 和j无边,否则j和j有边相通;(3)任一顶点I的度是第I行非0元素的个数。
7.2(1)任一顶点间均有通路,故是强连通;(2)简单路径V4 V3 V1 V2;(3)0 1 ∞ 1∞ 0 1 ∞1 ∞ 0 ∞∞∞ 1 0邻接矩阵邻接表(2)从顶点4开始的DFS序列:V5,V3,V4,V6,V2,V1(3)从顶点4开始的BFS序列:V4,V5,V3,V6,V1,V27.4(1)①adjlisttp g; vtxptr i,j; //全程变量② void dfs(vtxptr x)//从顶点x开始深度优先遍历图g。
在遍历中若发现顶点j,则说明顶点i和j间有路径。
{ visited[x]=1; //置访问标记if (y= =j){ found=1;exit(0);}//有通路,退出else { p=g[x].firstarc;//找x的第一邻接点while (p!=null){ k=p->adjvex;if (!visited[k])dfs(k);p=p->nextarc;//下一邻接点}}③ void connect_DFS (adjlisttp g)//基于图的深度优先遍历策略,本算法判断一邻接表为存储结构的图g种,是否存在顶点i //到顶点j的路径。
设 1<=i ,j<=n,i<>j.{ visited[1..n]=0;found=0;scanf (&i,&j);dfs (i);if (found) printf (” 顶点”,i,”和顶点”,j,”有路径”);else printf (” 顶点”,i,”和顶点”,j,”无路径”);}// void connect_DFS(2)宽度优先遍历全程变量,调用函数与(1)相同,下面仅写宽度优先遍历部分。
王道数据结构 第七章 查找思维导图-高清脑图模板

每次调整的对象都是“最小不平衡子树”
插入操作
在插入操作,只要将最小不平衡子树调整平衡,则其他祖先结点都会恢复平衡
在A的左孩子的左子树中插入导致不平衡
由于在结点A的左孩子(L)的左子树(L)上插入了新结点,A的平衡因子由1增
至2,导致以A为根的子树失去平衡,需要一次向右的旋转操作。
LL
将A的左孩子B向右上旋转代替A成为根节点 将A结点向右下旋转成为B的右子树的根结点
RR平衡旋转(左单旋转)
而B的原左子树则作为A结点的右子树
在A的左孩子的右子树中插入导致不平衡
由于在结点A的左孩子(L)的右子树(R)上插入了新结点,A的平衡因子由1增
LR
至2,导致以A为根的子树失去平衡,需要两次旋转操作,先左旋转再右旋转。
将A的左孩子B的右子树的根结点C向左上旋转提升至B结点的位置
本质:永远保证 子树0<关键字1<子树1<关键字2<子树2<...
当左兄弟很宽裕时,用当前结点的前驱、前驱的前驱来填补空缺 当右兄弟很宽裕时,用当前结点的后继、后继的后继来填补空缺
兄弟够借。若被删除关键字所在结点删除前的关键字个数低于下限,且与此结点 右(或左)兄弟结点的关键字还很宽裕,则需要调整该结点、右(或左)兄弟结 点及其双亲结点及其双亲结点(父子换位法)
LL平衡旋转(右单旋转)
而B的原右子树则作为A结点的左子树
在A的右孩子的右子树中插入导致不平衡
由于在结点A的右孩子(R)的右子树(R)上插入了新结点,A的平衡因子由-1
减至-2,导致以A为根的子树失去平衡,需要一次向左的旋转操作。
RR
将A的右孩子B向左上旋转代替A成为根节点 将A结点向左下旋转成为B的左子树的根结点
数据结构第七章:图

例
a c G1
b d
vexdata firstarc adjvex next 1 4 ^ a 2 3 4 b c d 1 1 3 ^ ^ ^
19
7.3 图的遍历
深度优先遍历(DFS) 深度优先遍历
方法:从图的某一顶点 出发,访问此顶点; 方法:从图的某一顶点V0出发,访问此顶点;然后依 次从V 的未被访问的邻接点出发,深度优先遍历图, 次从 0的未被访问的邻接点出发,深度优先遍历图, 直至图中所有和V 相通的顶点都被访问到; 直至图中所有和 0相通的顶点都被访问到;若此时图 中尚有顶点未被访问, 中尚有顶点未被访问,则另选图中一个未被访问的顶 点作起点,重复上述过程, 点作起点,重复上述过程,直至图中所有顶点都被访 问为止。 问为止。
ω ij , 若(v i , v j )或 < v i , v j >∈ E(G) A[i, j ] = 0,其它
11
例
1 3
5
2
8 4 7 5 1 6 3 4 2
0 5 7 0 3
5 0 0 4 8
7 0 0 2 1
0 4 2 0 6
3 8 1 6 0
12
关联矩阵——表示顶点与边的关联关系的矩阵 表示顶点与边的关联关系的矩阵 关联矩阵
1
7.1 图的定义和术语
是由两个集合V(G)和E(G)组成的 组成的, 图(Graph)——图G是由两个集合 图 是由两个集合 和 组成的 记为G=(V,E) 记为
其中: 其中:V(G)是顶点的非空有限集 是顶点的非空有限集 E(G)是边的有限集合,边是顶点的无序对或有序对 是边的有限集合, 是边的有限集合
有向图——有向图 是由两个集合 有向图G是由两个集合 有向图 有向图 是由两个集合V(G)和E(G)组成的 和 组成的
数据结构第七章 树和森林

7.5 树的应用
➢判定树
在实际应用中,树可用于判定问题的描述和解决。
•设有八枚硬币,分别表示为a,b,c,d,e,f,g,h,其中有一枚且 仅有一枚硬币是伪造的,假硬币的重量与真硬币的重量不同,可能轻, 也可能重。现要求以天平为工具,用最少的比较次数挑选出假硬币, 并同时确定这枚硬币的重量比其它真硬币是轻还是重。
的第i棵子树。 ⑺Delete(t,x,i)在树t中删除结点x的第i棵子树。 ⑻Tranverse(t)是树的遍历操作,即按某种方式访问树t中的每个
结点,且使每个结点只被访问一次。
7.2.2 树的存储结构
顺序存储结构 链式存储结构 不管哪一种存储方式,都要求不但能存储结点本身的数据 信息,还要能够唯一的反映树中各结点之间的逻辑关系。 1.双亲表示法 2.孩子表示法 3.双亲孩子表示法 4.孩子兄弟表示法
21
将二叉树还原为树示意图
A BCD
EF
A
B
C
E
D
F
A
B
C
E
D
F
22
练习:将下图所示二叉树转化为树
1 2
4
5
3
6
2 4
1 53
6
23
7.3.2 森林转换为二叉树
由森林的概念可知,森林是若干棵树的集合,只要将森林中各棵树 的根视为兄弟,森林同样可以用二叉树表示。 森林转换为二叉树的方法如下:
⑴将森林中的每棵树转换成相应的二叉树。 ⑵第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树 的根结点作为前一棵二叉树根结点的右孩子,当所有二叉树连起来 后,此时所得到的二叉树就是由森林转换得到的二叉树。
相交的集合T1,T2,…,Tm,其中每一个集合Ti(1≤i≤m)本身又是 一棵树。树T1,T2,…,Tm称为这个根结点的子树。 • 可以看出,在树的定义中用了递归概念,即用树来定义树。因此, 树结构的算法类同于二叉树结构的算法,也可以使用递归方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
n n ID ( v ) = OD ( v ) = e i i i =1 i =1
V3
V4
4)子图:
7.1 图的概念
设有两个图 G=(V, E) 和 G’=(V’, E’)。 若 V’ V 且 E’ E, 且E’ 中的边所关联的顶点均 在V’中,则称 图G’ 是 图G 的子图。
7.1 图的概念 5)路径:在无向图G=(V, E)中,从顶点vp到顶点vq之 间的路径是一个顶点序列(vp=vi0,vi1,vi2, …, vim=vq),其 中, (vij-1,vij)∈E( 1≤j≤m)。若 G是有向图,则路径也 是有方向的,顶点序列满足<vij-1,vij>∈E。
vexs=
V1 V2 V3 V4
V1 V2 V3 V4
V3
V4
0 0 arcs= 0 1
1 0 0 0
1 0 0 0
0 0 1 0
V1
V2
V3
V4
如何求顶点 i 的出度?
邻接矩阵的第 i 行非零元素个数。
7.2.1 邻接矩阵表示法
有向图的邻接矩阵
V1 V2 vexs= V1 V2 V3 V4
V1 V2 V3 V4
有向图: 图G中的每条边(有向边)都是有方向的; 无向图: 图G中的每条边(无向边)都是无方向的; 完全图: 图G任意两个顶点都有一条边相连接;
若 n 个顶点的无向图有 n(n-1)/2 条边, 称为无向完全图 若 n 个顶点的有向图有n(n-1) 条边, 称为有向完全图
例:判断下列4种图形各属什么类型? 7.1 图的概念
#define n 6 /*顶点数*/ #define e 8 /*边数*/ typedef char vextype; typedef float adjtype; typedef struct { vextype vexs[n]; adjtype arcs[n][n]; }graph;
1, 如果 < Vi , Vj > E 或者 (Vi , Vj ) E A[i ][ j ] = 否则 0,
7.2.1 邻接矩阵表示法
有向图的邻接矩阵
V1
V2
vexs=
V1 V2 V3 V4
V1 V2 V3 V4
V3
V4
0 0 arcs= 0 1
1 0 0 0
1 0 0 0
0 0 1 0
V1
V2
V3
V4
有向图的邻接矩阵一定不对称吗?
不一定,例如有向完全图。
7.2.1 邻接矩阵表示法
有向图的邻接矩阵
V1 V2
顶点的入度:在有向图中,顶点v的入度是指以该顶点为弧 头的弧的数目,记为ID (v); 顶点的出度:在有向图中,顶点v的出度是指以该顶点为弧 尾的弧的数目,记为OD (v)。 顶点的度:有向图中,入度与出度之和。 如:v1的入度为1,出度为2,度为3。 在具有 n 个顶点、 e 条边的有向图 G 中,各顶点的入度之和与各顶点的 出度之和的关系?与边数之和的关 系? V1 V2
无向图的邻接矩阵
vexs= V1 V4 V1 V2 V3 V4
V1 V2 V3 V4
V2
V3
0 1 arcs= 0 1
1 0 1 1
0 1 0 0
1 1 0 0
V1 V2 V3
V4
ቤተ መጻሕፍቲ ባይዱ
如何求顶点 i 的所有邻接点?
将数组中第 i 行元素扫描一遍,若arcs[i][j]为1,则 顶点 j 为顶点 i 的邻接点。
第七章 图
1
2 3 4 5
图的概念 图的存储
图的遍历 生成树和最小生成树
最短路径
7.1 图的概念
1、图的定义:记为 G=( V, E ) 其中:V 是G的顶点集合,是有穷非空集; E 是G的边集合,是有穷集。
问:当E(G)为空时,图G存在否? 答:存在!但此时图G只有顶点而没有边。
V为顶点(vertex) E为边(edge)
3、图的基本术语
7.1 图的概念
1)简单图:在图中,若不存在顶点到其自身的边, 且同一条边不重复出现。 V1 V3 V4 非简单图 V5 V4 非简单图 V2 V1 V3 V5 V2 V1 V2
V3 V4
简单图 V5
数据结构中讨论的都是简单图。
2)邻接、关联 无向图中,对于任意两个顶点 vi和顶点 vj,若存在边 (vi, vj),则称顶点 vi和顶点 vj互为邻接点,同时称边 (vi,vj)关联于顶点vi和顶点vj。 V2 V1
7.2.1 邻接矩阵表示法
无向图的邻接矩阵
vexs=
V1 V2 V3 V4
V1 V2 V3 V4
V1
V4
V2
V3
0 1 arcs= 0 1
1 0 1 1
0 1 0 0
1 1 0 0
V1
V2
V3 V4
无向图的邻接矩阵特点? 主对角线为 0 且一定是对称矩阵。
7.2.1 邻接矩阵表示法
无向图的邻接矩阵
0或 ∞
V1 5
2
7 8
V2
V3
V4
∞ 2 ∞ ∞ arcs= ∞ ∞ 7 ∞
5 ∞ ∞ ∞
∞ ∞ 8 ∞
建立无向网络邻接矩阵步骤: 建立无向网络的邻接矩阵算法: (1)读入n个顶点信息,建 Void CREATGRAPH(graph *ga) { int i,j,k; float w; 立顶点表; (2)邻接矩阵初始化,即 for (i=0;i<n;i++) arcs[i][j]=0; ga->vexs[i]=getchar(); (3)读入e条边,修改相应 for(i=0;i<n;i++) 的arcs[i][j]的值。 for(j=0;j<n;j++) ga->arcs[i][j]=0; 注意:
3 4 1 2 ^ 0 ^
v3 v4
v4
4
4 3
3
2 2
1
0 1
^
^ ^
思考:如何求结点的度? 例2:有向图的邻接表
v0 v2 v1 v3
V0 V1 ^ V2
注:邻接表不唯一,因各个边结点的链入顺序是任意的。
邻接表(出边)
2 3 ^ 1 ^
逆邻接表(入边)
V0 V1 3 ^
0 ^
0 ^ 2 ^
V2
V3
小结: 邻接矩阵法优点: 容易实现图的操作,如:求某顶点的 度、判断顶点之间是否有边(弧)、找顶 点的邻接点等等。 邻接矩阵法缺点: n个顶点需要n*n个单元存储边(弧); 空间效率为O(n2)。 对稀疏图而言尤其浪 费空间。
改进方法:利用邻接表来表示 。
7.2.2 邻接表表示法
对每个顶点Vi建立一个单链表,把与Vi相邻接的所有顶点Vj 链接起来,构成顶点Vi的邻接表。 顶点表结点 边表结点
V3
V4
0 0 arcs= 0 1
1 0 0 0
1 0 0 0
0 0 1 0
V1
V2
V3
V4
如何求顶点 i 的入度?
邻接矩阵的第 i 列非零元素个数。
7.2.1 邻接矩阵表示法
有向图的邻接矩阵
V1 V2 vexs= V1 V2 V3 V4
V1 V2 V3 V4
V3
V4
0 0 arcs= 0 1
1 0 0 0
无向完全图
无向图(树)
有向图
有向完全图
G1的顶点集合为V(G1)={0,1,2,3} 边集合为E(G1)={(0,1),(0,2),(0,3),(1,2),(1,3),(2,3)} G3的顶点集合为V(G3)={0,1,2} 弧的集合为E(G3)={<0,1>,<1,0>,<1,2>} <0,1>表示顶点0到顶点1的一条弧。(有序对)
无向图:修改arcs[i][j], 同时修改相应的arcs[j][i]; 有向图:只需要修改 arcs[i][j]。 } for(k=0;k<e;k++) { scanf(“%d,%d,%f”,&i,&j,&w); ga->arcs[i][j]=w; ga->arcs[j][i]=w; }
7.2.1 邻接矩阵表示法
vertex
顶点域: 存放顶点 vi 的信息
link
边表头指针: 指向单链表的 第一个结点
adjvex
邻接点域:表 示vi一个邻接 点的位置
next
链域:指向 vi下一个边 或弧的结点
所有顶点表头结点用顺序存储结构存储。
例1:无向图的邻接表
v0 v2 v1
邻接表 0 v0 1 v1 2 v2 3 v3 4 v4
V1 到V4的路径: V1 V4 V1 V2 V3 V4 V1 V2 V5V3 V4
V1
V3 V4
V2
V5
一般情况下,图中的路径不唯一。 路径长度:该路径上边的数目。
7.1 图的概念
回路(环):第一个顶点和最后一个顶点相同的路径。 简单路径:序列中顶点不重复出现的路径。 简单回路(简单环):除了第一个顶点和最后一个顶点外,其 余顶点不重复出现的回路。
无向图的邻接矩阵
vexs= V1
V4 V1 V2 V3 V4
V1 V2 V3 V4
V2
V3
0 1 arcs= 0 1
1 0 1 1
0 1 0 0
1 1 0 0
V1
V2
V3 V4
如何判断顶点 i 和 j 之间是否存在边? 测试邻接矩阵中相应位置的元素arcs[i][j]是否为1。
7.2.1 邻接矩阵表示法