数据结构第七章图
第七章图状结构

图的应用非常广泛。
2
7.1 图的类型定义
7.2 图的存储表示
7.3 图的遍历
7.4 最小生成树 7.5 两点之间的最短路径问题 7.6 拓扑排序
7.7 关键路径
3
图的结构定义:
图是由一个顶点集 V 和一个弧集 R构 成的数据结构。 Graph = (V , R ) 其中,R={<v,w>| v,w∈V 且 P(v,w)} <v,w>表示从 v 到 w 的一条弧,并称 v 为弧尾,w 为弧头。
4
由于“弧”是有方向的,因此称由顶 点集和弧集构成的图为有向图。
例如: G1 = (V1, VR1)
A
B C D E
其中 V1={A, B, C, D, E} VR1={<A,B>, <A,E>,
<B,C>, <C,D>, <D,B>, <D,A>, <E,C> }
5
若<v, w>VR 且<w, v>VR, 则称 (v,w) 为顶点v 和顶点 w 之间存在一条边。 例如: G2=(V2,VR2) V2={A, B, C, D, E, F} VR2={(A,B), (A,E),
0 0 0 1 0 1
0 0 1 0 0 1
1 1 0 0 0 0
0 1 1 1 0 0
24
无向图邻接矩阵表示法特点:
1)无向图邻接矩阵是对称矩阵 2)顶点v的度 3)判断两顶点v、u是否为邻接点 4)顶点不变,在图中增加、删除边 5)适用于边稠密的图;
25
有向图的邻接矩阵 为非对称矩阵
0 0 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0
第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分)】
数据结构 第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. 图 ()8. 已知图的邻接矩阵,根据算法思想,则从顶点0出发按深度优先遍历的结点序列是( D )9. 已知图的邻接矩阵同上题8,根据算法,则从顶点0出发,按深度优先遍历的结点序列是A . 0 2 4 3 1 5 6 B. 0 1 3 5 6 4 2C. 0 4 2 3 1 6 5D. 0 1 2 34 6 5 ( 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 3(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)组成的 和 组成的
数据结构(C语言版)_第7章 图及其应用
实现代码详见教材P208
7.4 图的遍历
图的遍历是对具有图状结构的数据线性化的过程。从图中任 一顶点出发,访问输出图中各个顶点,并且使每个顶点仅被访 问一次,这样得到顶点的一个线性序列,这一过程叫做图的遍 历。
图的遍历是个很重要的算法,图的连通性和拓扑排序等算法 都是以图的遍历算法为基础的。
V1
V1
V2
V3
V2
V3
V4
V4
V5
图9.1(a)
图7-2 图的逻辑结构示意图
7.2.2 图的相关术语
1.有向图与无向图 2.完全图 (1)有向完全图 (2)无向完全图 3.顶点的度 4.路径、路径长度、回路、简单路径 5.子图 6.连通、连通图、连通分量 7.边的权和网 8.生成树
2. while(U≠V) { (u,v)=min(wuv;u∈U,v∈V-U); U=U+{v}; T=T+{(u,v)}; }
3.结束
7.5.1 普里姆(prim)算法
【例7-10】采用Prim方法从顶点v1出发构造图7-11中网所对 应的最小生成树。
构造过程如图7-12所示。
16
V1
V1
V2
7.4.2 广度优先遍历
【例7-9】对于图7-10所示的有向图G4,写出从顶点A出发 进行广度优先遍历的过程。
访问过程如下:首先访问起始顶点A,再访问与A相邻的未被 访问过的顶点E、F,再依次访问与E、F相邻未被访问过的顶 点D、C,最后访问与D相邻的未被访问过的顶点B。由此得到 的搜索序列AEFDCB。此时所有顶点均已访问过, 遍历过程结束。
【例7-1】有向图G1的逻辑结构为:G1=(V1,E1) V1={v1,v2,v3,v4},E1={<v1,v2>,<v2,v3>,<v2,v4>,<v3,v4>,<v4,v1>,<v4,v3>}
数据结构-第7章图答案
7.3 图的遍历 从图中某个顶点出发游历图,访遍图中其余顶点, 并且使图中的每个顶点仅被访问一次的过程。 一、深度优先搜索 从图中某个顶点V0 出发,访问此顶点,然后依次 从V0的各个未被访问的邻接点出发深度优先搜索遍 历图,直至图中所有和V0有路径相通的顶点都被访 问到,若此时图中尚有顶点未被访问,则另选图中 一个未曾被访问的顶点作起始点,重复上述过程, 直至图中所有顶点都被访问到为止。
void BFSTraverse(Graph G, Status (*Visit)(int v)) { // 按广度优先非递归遍历图G。使用辅助队列Q和访问标志数组 visited。 for (v=0; v<G.vexnum; ++v) visited[v] = FALSE; InitQueue(Q); // 置空的辅助队列Q for ( v=0; v<G.vexnum; ++v ) if ( !visited[v]) { // v尚未访问 EnQueue(Q, v); // v入队列 while (!QueueEmpty(Q)) { DeQueue(Q, u); // 队头元素出队并置为u visited[u] = TRUE; Visit(u); // 访问u for ( w=FirstAdjVex(G, u); w!=0; w=NextAdjVex(G, u, w) ) if ( ! visited[w]) EnQueue(Q, w); // u的尚未访问的邻接顶点w入队列Q
4。邻接多重表
边结点
mark ivex
顶点结点
ilink
jvex
jlink
info
data
firstedge
#define MAX_VERTEX_NUM 20 typedef emnu {unvisited, visited} VisitIf; typedef struct Ebox { VisitIf mark; // 访问标记 int ivex, jvex; // 该边依附的两个顶点的位置 struct EBox *ilink, *jlink; // 分别指向依附这两个顶点的下一条 边 InfoType *info; // 该边信息指针 } EBox; typedef struct VexBox { VertexType data; EBox *firstedge; // 指向第一条依附该顶点的边 } VexBox; typedef struct { VexBox adjmulist[MAX_VERTEX_NUM]; int vexnum, edgenum; // 无向图的当前顶点数和边数 } AMLGraph;
《数据结构》第 7 章 图
v3
v4 v5 v4
v3
v5 v4
v3
v5 v4
v3
v5 v4
v3
v5
注
一个图可以有许多棵不同的生成树。 所有生成树具有以下共同特点: 生成树的顶点个数与图的顶点个数相同; 生成树是图的极小连通子图; 一个有 n 个顶点的连通图的生成树有 n-1 条边; 生成树中任意两个顶点间的路径是唯一的; 在生成树中再加一条边必然形成回路。 含 n 个顶点 n-1 条边的图不一定是生成树。
A1 = {< v1, v2>, < v1, v3>, < v3, v4>, < v4, v1>} v1 v2
有向图
v3
v4
制作:计算机科学与技术学院 徐振中
数据结构 边:若 <v, w>∈VR 必有<w, v>∈VR,则以 无序对 (v, w) 代表这两个有序对,表示 v 和 w 之 间的一条边,此时的图称为无向图。 G2 = (V2, E2) V2 = {v1, v2, v3, v4, v5}
第七章 图
E2 = {(v1, v2), (v1, v4), (v2, v3), (v2, v5) , (v3, v4), (v3, v5)} v1
G2
v3
v2
无向图
v4
v5
制作:计算机科学与技术学院 徐振中
数据结构
第七章 图
例:两个城市 A 和 B ,如果 A 和 B 之间的连线的涵义是 表示两个城市的距离,则<A, B> 和 <B, A> 是相同的, 用 (A, B) 表示。 如果 A 和 B 之间的连线的涵义是表示两城市之 间人口流动的情况,则 <A, B> 和 <B, A> 是不同的。 北京 <北京,上海> (北京,上海) <上海,北京> <北京,上海> 北京 上海 上海
数据结构第七章--图(严蔚敏版)
8个顶点的无向图最多有 条边且该图为连通图 个顶点的无向图最多有28条边且该图为连通图 个顶点的无向图最多有 连通无向图构成条件:边 顶点数 顶点数-1)/2 顶点数*(顶点数 连通无向图构成条件 边=顶点数 顶点数 顶点数>=1,所以该函数存在单调递增的单值反 顶点数 所以该函数存在单调递增的单值反 函数,所以边与顶点为增函数关系 所以28个条边 函数 所以边与顶点为增函数关系 所以 个条边 的连通无向图顶点数最少为8个 所以28条边的 的连通无向图顶点数最少为 个 所以 条边的 非连通无向图为9个 加入一个孤立点 加入一个孤立点) 非连通无向图为 个(加入一个孤立点
28
无向图的邻接矩阵为对称矩阵
2011-10-13
7.2
图的存储结构
Wij 若< vi,vj > 或<vj,v i > ∈E(G)
若G是网(有权图),邻接矩阵定义为 是网(有权图), ),邻接矩阵定义为
A [ i,j ] = , 0或 ∞
如图: 如图:
V1
若其它
V2
3 4
2
V3
2011-10-13
C
A
B
D 2011-10-13 (a )
3
Königsberg七桥问题
• Königsberg七桥问题就是说,能否从某点出发 通过每桥恰好一次回到原地?
C
C
A B
.
A D
B
D (a)
2011-10-13
(b)
4
第七章 图
7.1 图的定义 7.2 图的存储结构 7.3 图的遍历 7.4 图的连通性问题 7.5 有向无环图及其应用 7.6 最短路径
2011-10-13
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
10
7.2.1 邻接矩阵
【例7-2】对于图7-2(a)所示的无向图,请给出它 的邻接矩阵,并根据邻接矩阵计算顶点v2的度。
v1 v 2 V v3 v4 v5 v1 v1 0 v2 1 A v3 1 v4 0 v5 0 v2 v3 v4 v5 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 1 1 0 1 0 边 v2 v5 v4 的 度 2
边v2v5
对角元皆为0
11
7.2.1 邻接矩阵
对于带权图(网),邻接矩阵A中的元素定义为:
, vi与v j相邻且具有边或弧相连 w aij ij ,其它
【例7-4】对于图7-5(b)所示的网,请给出它的邻 接矩阵。
13 8 12 3 7 10 A 15 6 7
9
7.2 图的存储结构
7.2.1 邻接矩阵 邻接矩阵是表示顶点之间相邻关系的矩阵。 设G=(V,E)是一个具有n个顶点的图。它的顶点集 合V={v0,v1,…,vn-1},则顶点间的关系E可用如下形 式的矩阵A描述。 对于A中的每一个元素aij满足:
1 , vi 与v j 相邻且具有边或弧相连 aij 0 ,其它
v3
3
7.1.1图的定义
完全图:含有n个顶点和条边的无向图称为完全图。 在完全图中,任意两个顶点之间均有边相连 推论1:具有n个顶点的无向图最多有条边。 有向完全图:含有n个顶点和n(n-1)条弧的有向图 称为有向完全图。在有向完全图中,任意两个顶点 之间均有两条方向相反的弧。 推论2:具有n个顶点的有向图最多有n(n-1)条弧。
v1
v1
v2
v3
v2
v3
4
7.1.1图的定义
邻接点:在无向图中,若存在一条边(vi, vj),则称vi和vj互 为邻接点。称边(vi, vj)依附于顶点vi和vj或称边(vi, vj)与顶点 vi和vj相关联。 顶点的度:在无向图中,与顶点v相关联的边数称为顶点v 的度,记作TD(v)。 在有向图中,顶点的度又分为顶点的入度和顶点的出度。 顶点的入度是指以顶点v为弧头的弧的数目,记作ID(v); 顶点的出度是指以顶点v为弧尾的弧的数目,记作OD(v)。 顶点v的度等于顶点v的入度和出度之和,即 TD(v)=ID(v)+OD(v)。 推论3:对于无向图,其总度数是总边数的两倍。 推论4:对于有向图,其总入度、总出度和总边数相等。
1 2 3 7 8 4 6 5
2 3 4 1 6 5 7 8
v1
v4
v1
v2
v3
v2
7
7.1.1图的定义
权:图中边或弧上附带的数据称为权。 网:带权的图称为网。 生成树:包含连通图全部顶点的极小连通子图称作该图的 生成树。即以最少的边连接连通图中所有顶点。 推论6:有n个顶点的连通图,它的生成树一定包含n个顶点 和n-1条边。若加上一条边则构成环,若减去一条边则是非 北京 连通图。 130
700 郑州 500 武汉 1000 900 广州 800 上海 350 天津 700 徐州 600
南昌
8
7.1.2 图的抽象数据类型
ADT Graph 数据元素集合:具有相同性质的称为顶点的有限数据元素集合,以及称为弧或边 的有限集合。 基本操作: 创建图(CreateGraph):按顶点和弧的定义构造图 查找顶点(LocateVex):返回指定顶点在图中的位置 取顶点值(GetVex):返回指定顶点的值 给顶点赋值(PetVex):给指定顶点赋值 取第一个邻接点(FirstAdjVex):取顶点的第一个邻接点 取下一个邻接点(NextAdjVex):取顶点的下一个邻接点 插入顶点(InsertVex):在图中插入新顶点 删除顶点(DeleteVex):在图中删除指定顶点及相关的弧 插入弧(InsertArc):在图中插入一条新弧 删除弧(DeleteArc):在图中删除指定的弧 深度优先遍历(DFSTraverse):对图进行深度优先遍历 广度优先遍历(BFSTraverse):对图进行广度优先遍历
2
7.1.1图的定义
有向图:由有方向的边构成的图称为有向图。 弧:有向图中的边由顶点的有序偶对组成。顶点偶 对<vi,vj>表示从顶点vi指向顶点vj的一条有向边, 也称为弧。顶点vi是有向边的始点,也称为弧尾。 顶点vj是有向边的终点,也称为弧头。
边
v1 v3 v5 v2 v4
顶点
弧
v1 v4
v2
15
7.2.1 邻接矩阵
(4)取下一个邻接点
int GetNext(AdjMetrix g,int k,int t){ int i; if(k<0 || k>g->vexs || t<0 || t>g->vexs) { printf("参数k或t超出范围!\n"); return NULL; } for(i=t+1;i<g->vexs;i++) if(g->arcs[k][i]==1) return i; return -1; }
(8)删除边
void DeleteArc(AdjMetrix g,int u,int v){ if(u<0 || u>g->vexs || v<0 || v>g->vexs){ printf("参数u或v超出范围!\n"); return ;} g->arcs[u][v]=0; }
17
7.2.2 邻接表
12
7.2.1 邻接矩阵
用C语言描述的邻接矩阵:
#define MAXVEX 50 /*最大顶点个数*/ typedef int weight; /*权值*/ typedef struct{ weight arcs[MAXVEX][MAXVEX];/*邻接矩阵*/ DataType data[MAXVEX];/*顶点信息*/ int vexs; /*顶点数*/ }MGraph,*AdjMetrix;
void CreateGraph(AdjList *g,int m[][MAXVEX],int n){/*n为顶点总数*/ int i,j;PArcNode p; *g=(AdjList)malloc(sizeof(VGraph));/*初始化邻接表*/ (*g)->edges=0; (*g)->vexs=n; for(i=0;i<n;i++){ (*g)->lists[i].head=NULL;/*边表头指针初始化*/ for(j=n-1;j>=0;j--) if(m[i][j]!=0) { /*矩阵元素不为0,则在边表中生成一个结点*/ p=(PArcNode)malloc(sizeof(ArcNode)); p->adjvex=j; p->next=(*g)->lists[i].head;/*从链表头部插入新结点*/ (*g)->lists[i].head=p;(*g)->edges++; }}}
16
7.2.1 邻接矩阵
(7)插入边
void InsertArc(AdjMetrix g,int u,int v,weight w){ if(u<0 || u>g->vexs || v<0 || v>g->vexs){ printf("参数u或v超出范围!\n");return ;} g->arcs[u][v]=w; }
第七章 图
1
7.1 图的基本概念
7.1.1图的定义
图中的数据元素称为顶点。在顶点集合V中,第i个顶点记 作vi 图中两个顶点vi和vj之间有关联关系,称作顶点vi和vj之间 有一条边。在边集合E中,第k条边记作ek=<vi,vj>。 图是由顶点的非空有限集合与顶点间关系集合构成的数据 结构。记作G=(V,E)。其中,V为顶点集合,E为顶点间关 系——边的集合。 无向图:由没有方向的边构成的图称为无向图。 无向图中的边由顶点的无序偶对组成,因此,在无向图中, 顶点偶对<vi,vj>与顶点偶对<vj,vi>表示同一条边,记作 (vi,vj)。
5
7.1.1图的定义
路径:在图G中,从顶点vi出发,经过一系列的边或弧能够 到达顶点vj,则称顶点vi到顶点vj的顶点序列为从顶点vi到 顶点vj的路径。该路径上所包含的边的数目称为路径长度 简单路径:若路径上各顶点互不重复,则称这样的路径为 简单路径。 环或回路:若路径上第一个顶点和最后一个顶点相同,则 称这样的路径为环或回路。 子图:对于图G={V,E}和图G´={V´,E´},若存在V´ V且 边 顶点 E´ E,则称图G´是图G的子图。
data head
逆邻接表:结构与邻接表完全相同,只是边表中每个结点 存放的是每条弧的弧尾顶点。
18
ቤተ መጻሕፍቲ ባይዱ
7.2.2 邻接表
C语言描述的邻接表:
#define MAXVEX 50 typedef struct arc{/*边表结点类型*/ int adjvex;/*顶点序号*/ struct arc* next;/*指向下一个邻接点*/ }ArcNode,*PArcNode; typedef struct{/*顶点表结点类型*/ DataType data;/*顶点信息*/ ArcNode* head;/*边表头指针*/ }VexNode; typedef struct{/*邻接表类型*/ VexNode lists[MAXVEX];/*顶点表*/ int edges,vexs;/*边数,顶点数*/ }VGraph,*AdjList;