869-数据结构第7章图
数据结构第七章图

1 B 4 6 C F I 2 E 8 3
D
5 7
G
H
访问序列为:A、B、E、D、C、G、F、H、I。
广度优先搜索算法:
Procedure bfs(i:1..n);{图用邻接表g表示} Begin create(q); {建队,置队空} write(g[i].v); {访问vi} visited[i]:=true; {标记已经访问的结点} push(q,i); {进队列} while not empty(q) do {广度优先遍历,直到队列空为止,表示所有节点都被 访问过了} begin i:=pop(q); {取顶点,对首元素出队} p:=g[i].link; {取边表指针} while p<>nil do {还有后继顶点} begin if not visited[p^.adj] then begin write(g[p^.adj].v); {访问当前顶点} visited[p^.adj]:=true; push(q,p^,adj); {当前顶点入队} end; p:=p^.next; {从边表中取下一个邻接边} end; end; End;
若图G是一个网络,其邻接矩阵 w i j 若 (v i,v j) E,且 (v i,v j)的 权 值 为 w ij A[i ][ j ] 借助于邻接矩阵很容易判定任意两个顶点之间是否有边(或 弧)相连,并容易求得各个顶点的度,操作方便。 (2)邻接矩阵法的特点: 1. 存储空间:对于无向图而言,它的邻接矩阵是对称矩阵, 所以可采用压缩存储法(下三角),其存储空间只需n(n+1)/2。 但对于有向图而言,因为它的弧是有方向的,它的邻接矩阵不 一定是对称矩阵,所以需要n2个存储空间。 2. 便于运算:采用邻接矩阵表示法,便于判定图中任意两个 顶点之间是否有边相连,即根据A[i,j]=0或1来判断。另外还 便于求得各个顶点的度。
数据结构-第7章.

7.2.1数组表示法
有向图的邻接矩阵
0 0 arcs 0 0 0
1 0 0 1 0
1 0 0 0 0
1 0 0 0 0
1 0 1 0 0
B A D
C
19:51:40
E
A B vexs C D E
一个连通图包含图中的所有顶点的生成树是它的最小 连通子图,在n个顶点的情形下,有n-1条边。
60
B
80 75
40
10
2
6
7 12 7
5
A
30
C
35
1
15
9
3
8
6
3
6
D
19:51:40
45
E
4
16
7
CH.7 11
7.1图的定义和术语
60
B
80
75
数据结构中不予讨论的图
A
30
包含顶点到其自身的边; 一条边在图中重复出现; 没连接两个顶点的边。
19:51:40
CH.7
15
图的ADT描述
InsertVex(&G,v); 初始条件:图G存在,v和图中顶点有相同特征 操作结果:在图G中增添新顶点v DeleteVex(&G,v); 初始条件:图G存在,v是G中某个顶点 操作结果:删除G中顶点v及其相关的弧 InsertAcr(&G,v,w); 初始条件:图G存在,v和w是G中两个顶点 操作结果:在G中增添弧<v,w>,若G是无向的,则 还增添对称弧<w,v>
19:51:40
数据结构第七章图PPT课件

CAC - 2
CAC - 3
7.1 图的定义和术语
7.1.1 图的定义和术语
1. 图的定义(graph)
图G由两个集合构成,记作G=<V,E> ,其中V是顶点的非空有限集合,
E是顶点间关系----边的有限集合,边是顶点的无序对或有序对集合。 。
【例】 V0
V1
V2
V3
V4
无序对(vi,vj): 用连接顶点vi、vj的线段
V0
V1
V0
V1
V2
V3
V2
V3
两个强连通分量
CAC - 17
练习
具有n个顶点的强连通图至少有多少条边?是什么形状?
分析:强连通图是针对有向图而言的。由于强连通图要求 图中任何2个顶点之间能够连通,因此每个顶点至少要有一条 以该顶点为终点(弧头)和出发点(弧尾)的弧,每个顶点 的入度和出度至少各为1,即顶点的度至少为2。
边或弧
G2=<V2,E2> V2={ v0 ,v1,v2,v3 } E2={ <v0,v1 > , <v0,v2 >, <v2,v3 >,<v3,v0 > }
CAC - 6
7.1.1 图的定义和术语
2. 图的相关术语 (1)无向图:若图G中所有边是没有方向的,则称G为无向图。 (2)有向图:若图G中所有顶点间的连线是有方向的,则称G为有向图。 (3)顶点:数据元素Vi称为顶点。 (4)边和弧:P(Vi,Vj)表示在顶点Vi和Vj之间有线相连,如果是无向图, 则称该线为边;在有向图中,则称该连线为弧。边用顶点的无序偶对(Vi, Vj)表示,弧用有序偶对< Vi,Vj >表示。 (5)弧头和弧尾:有序偶对的第一个结点称为始点(或弧尾,即不带箭 头的一端),有序偶对的第二个结点称为终点(或弧头,即带箭头的一 端)。
数据结构:第7章 图

6.2 图的存储结构
➢图的邻接矩阵存储表示
6.2 图的存储结构
➢采用数组表示法构造无向网G
• 输入顶点数、边数等基本数据 • 输入各顶点信息,构造顶点向量 G.vexs[n] • 初始化邻接矩阵 G.arcs • 输入各条边所依附的顶点及权值,写入邻接矩阵G.arcs
6.2 图的存储结构
➢采用邻接矩阵表示法,创建无向网G
图的定义和术语
• 对于有n个顶点的图,最多有多少条弧? (不考虑自身到自身的弧)
每个顶点最多向其它n-1个顶点分别发出一条弧 所以
• n个顶点的有向图最多可以有 n(n-1)条弧 • 考虑无向图的情况: • n个顶点的无向图最多可以有n(n-1)/2 条边
• 弧(边)数达到最大的图称作完全图
• 有很少(如e<nlogn)弧(边)的图称为稀疏图 • 反之称为稠密图
图的定义和术语
• 无向图G=(V,{E}) • 从顶点v到顶点v’的路径 是由v出发到达v’的顶点序列 • 若为有向图,则路径也是有向的 • 第一个顶点和最后一个顶点相同的路径叫做回路或环 • 序列中顶点不重复出现的路径称为简单路径 • 除了第一个顶点和最后一个顶点之外,其余顶点不重复
出现的回路称为简单回路或简单环
图的定义和术语
• 无向图G中,如果从顶点v到v’有路径, 则称v和v’是连通的
• 对于任意两个顶点都连通的图,叫做连通图 • 无向图中的极大连通子图叫做连通分量
v1
v2
v3
v4
v5
图的定义和术语
• 有向图中, • 对于任意两个顶点都存在双向路径的图,叫做强连通图 • 有向图中的极大强连通子图叫做强连通分量
6.2 图的存储结构
➢数组表示法
数据结构第7章图3

从顶点0出发的深度优先遍历 序列。
1
1
0 0
0 0
1 0
0 1
0 0
1
0
深度优先遍历序列:
1
1
0
0
1
1
0
0, 1, 3, 4, 2, 5, 6
1 0 1 1 0 1 0
0 0 0 1 1 0 1
1 1 0 0 0 1 0
例5:已知图的邻接表如下,求从顶点0出发的深度优 先遍历序列。
for (v = 1; v <= G.vexnum; ++v)
visited[v] = FALSE; // 访问标志数组初始化
for (v = 1; v <= G.vexnum; ++v)
if(!visited[v]) DFS(G, v, Visit);
}
深 度 优 先 遍 历
void DFS (Graph G, int v, Status (*Visit)(int v)) {
2.广度优先搜索
广度优先遍历类似于树的按层次遍历。
采用的搜索方法的特点是尽可能先对横向进行搜 索,故称其为广度优先搜索(Breadth-FirstSearch)。 相应的遍历就称为广度优先遍历。
1. 深度优先搜索 DFS
基本思想:
选择图中某个(强)连通分量中某个顶点v出发: ⑴访问顶点 v,并将其访问标记置为访问过,即
连通分量: 非连通图的每一个连通部分称为连通分量。
A
BA
CD E
C
FGH
F
B
GH
I
K
I JK
课件c语言:数据结构第七章图

含有 e=n(n-1) 条弧的有向图称作 有 向完全图;
若边或弧的个数 e<nlogn,则称作
稀疏图,
13
1
1
4
2
3
4
2
3
无向完全图 有向完全图
15 A 9
11
B 7 21
E
3
C2 F
权:与图的边或 弧相关的数。
网:带权的图。
有两个图G=(V,{E}) 和
图 G=(V,{E}),
245
无向完全图 5
3
6
1
3
6
图与子图 例
例
245
1 57
1
3
6
32
46
G2
顶点5的度:3 顶点2的度:4
G1
顶点2入度:1 出度:3 顶点4入度:1 出度:0
例
路径:1,2,3,5,6,3 路径长度:5
245
简单路径:1,2,3,5
回路:1,2,3,5,6,3,1
1
3
6
简单回路:3,5,6,3
G1
31.12.2020
h
6
7.1 图的定义和术语
主
7.2 图的存储结构(***)
要
7.3 图的遍历(***)
内 容
7.4 图的连通性问题 最小生成树(***)
7.5 有向无环图及其应用
拓扑排序 关键路径
7.6 最短路径
图的结构定义:
图是由一个顶点集 V 和一个弧集 R构成的 数据结构。
Graph = (V , R ) 其中,VR={<v,w>| v,w∈V 且 P(v,w)}
C D
E
A F
数据结构(C语言版) 第七章 图
路径与连通性
路径、简单路径、回路(环)、简单回路
顶点之间的连通性、无向连通图、有向强连通
图
4/46
7.1 图的定义和术语(3)
路径与连通性
对于有向图G1
V1V3V4V1V2 是从V1 到V2 的路径, 不是简单路径;
V1V2是简单路径; V1V3V4V1V3V4V1是环,不是简单环; V1V3V4V1是简单环。
3/46
7.1 图的定义和术语(2)
有向图
弧<v,w> ∊ E (v,w ∊V),w为弧头, v为弧尾; 顶点v
邻接到顶点w,顶点w 邻接自顶点v,弧< v, w >和 顶点v、w相关联。
顶点v 的入度是以v 为弧头的弧的数目,记为ID(v); v 的出度是以v为弧尾的弧的数目,记为OD(v); v 的度是TD(v) = ID(v) + OD(v)。
}VNode, AdjList[MAX_VERTEX_NUM];
这种存储结构适合于进行first_adj(G,v) 找v的第一个邻接点的操作
邻接矩阵的方法适合存储稠密图
26/46
7.2.2 邻接表--- 链式存储结构
邻接表是一种顺序存储与链式结构相结 合的存储方式,类似于树的孩子链表。
对每个顶点建立一个单链表,第i个单链 表中的结点表示依附于顶点vi的边。
邻接矩阵
从邻接矩阵M中可以看出该图 共有( )个顶点;如果是有 向图该图共有( )条弧,如 果是无向图,则共有( )边。
AB CD
G
25/46
邻接矩阵存储的特点
无向图的邻接矩阵是对称的,对n个顶 点的无向图只需要存入下三角矩阵,即 需要n(n-1)/2个存储单元。
有向图的邻接矩阵所需要的存储单元不 一定,需要N*N个存储单元
数据结构第7章图
printf("请输入边的信息:\n"); for (k=0;k<G->arcnum;k++) { scanf("\n%d,%d",&i,&j); s=(EdgeNode*)malloc(sizeof(EdgeNode)); s->adjvex=j; s->nextadj=G->adjlist[i].firstedge; G->adjlist[i].firstedge=s; } }
(3) 时间复杂度 求边的数目,邻接矩阵方式下必须检测整个矩 阵,耗费的时间是O(n2);邻接表存储方式下 只对每个边表的结点个数计数即可求得e,所 耗费的时间,是O(e+n),当e≤n2时,采用邻接 表更节省时间; 如果要判定<vi,vj>是否是图的一条边,邻接 矩阵方式下只需判定矩阵中的第i行第j列上的 元素是否为零即可,时间复杂度为O(1); 邻接表存储方式下需扫描第i个边表,最坏情 况下时间复杂度为O(n)。
从图的某一点v出发,递归地进行深度优先搜索 的算法: void DFS(Graph G , int v ) { visited[v]=TRUE;Visit (v); for(w=FirstAdjVex(G ,v);w ; w=NextAdjVex(G ,v , w)) if (!visited[w]) DFS(G , w); }
用邻接矩阵来存储图时,算法时间复 杂度只与图中顶点数n相关,与边数e无 关,故比较适合于稠密图。 邻接矩阵表示法空间需求一般为n+n2 个空间,其中n代表顶点信息所占空间, n2代表邻接矩阵所占空间。 如何建立一张带权图呢?
2
邻接表 邻接表(Adjacency List) 是一种将顺序存储 与链式存储相结合的存储方法。为图中每个 顶点都建立一个单链表,即对于图G中的每 个顶点vi,将vi的所有邻接点vj都链在一个单 链表里,该单链表称为顶点vi的邻接表(链 式存储结构),再将所有顶点的邻接表表头 集中放到一个一维数组(顺序存储结构)中, 两者一起就构成了图的邻接表结构。
数据结构第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. 图有邻接矩阵、邻接表等存储结构,遍历图有深度优先遍历、广度优先遍历等方法。