数据结构-图的遍历ppt
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
为每个顶点设立一个“访问标志 visited[w]”;
-
深度优先搜索-连通图
void DFS(Graph G, int v) {
// 从顶点v出发,深度优先搜索遍历连通图 G
visited[v] = TRUE; for(w=FirstAdjVex(G, v);
w>=0; w=NextAdjVex(G,v,w)) if (!visited[w]) DFS(G, w);
图的遍历
复习 图的遍历 深度优先搜索 广度优先搜索 课堂练习 小结和作业
-
复习-图的存ቤተ መጻሕፍቲ ባይዱ结构
B A
F
C D
E
010010 100011 000101 001001 110000 011100
-
复习-图的存储结构
B A
F
C D
E
0A
1B 2C 3D 4E 5F
1
4
0
4
5
3
5
2
5
0
1
1
2
3
-
复习-图的存储结构
V6
V7
V8
-
深度优先搜索
V1
V2
V3
V4 V8
V6
V7
-
深度优先搜索
w2
w1 V
w7
w8
w3 w4
w6
w5
-
深度优先搜索-连通图
1、从深度优先搜索遍历连通图的过程类似于树的先 根遍历 2、对图G深度优先搜索得到的顶点序列不是唯一的? 3、搜索过程中经过的边和所有的顶点构成了图的一 棵生成树。 4、如何判别V的邻接点是否被访问?
V
w1
w2
SG1
SG2
访问顶点V ;
for (W1、W2、W3 ) w3 若邻接点Wi未被访问,
则从它出发进行深度优 SG3 先搜索历。
-
深度优先搜索-连通图
V1 V2 V5 V6 V3
V4
V8
V7
深度遍历序列: V1 V2 V4 V8 V5 V6 V3 V7
-
深度优先搜索
V1
V2
V3
V4
V5
-
存储结构的比较
•邻接矩阵:修改边<v, w>(以及<w,v>) •邻接表:无向图,修改两个顶点的链表;有向图, 修改一个(或两个)顶点的链表 •十字链表:涉及两个链表 •多重邻接表:涉及两个链表
-
存储结构的比较
4、邻接点
FirstAdjVex(G, v);
// 返回 v 的“第一个邻接点” 。若该顶点 //在 G 中没有邻接点,则返回“空”。
-
存储结构的比较
2、插入和删除顶点 InsertVex(&G, v); //在图G中增添新顶点v。 DeleteVex(&G, v); // 删除G中顶点v及其相关的弧。 都要对存放顶点数组元素的操作 但是对邻接矩阵,还要修改邻接矩阵
-
存储结构的比较
3、插入和删除弧 InsertArc(&G, v, w); DeleteArc(&G, v, w);
-
用C语言描述存储结构
1、图的二个参数:
顶点个数
Vertex(Vertices),vexnum
边数(弧数) Edge(arc),arcnum,edgenum
2、图的第三个参数: 图的类型 GraphKind={DG, UDG, DN, UDN}
-
图的遍历
定义:从图中某个顶点出发游历图,访遍图中其
-
邻接点函数的实现
FirstAdjVex(G, v); //返回第1个邻接点 的位置,没有邻接点,返回-1。
NextAdjVex(G, v, w); //返回w后面的邻接
点的位置。
0A
1
4
1B
0
4
5
2C 3D
3
5
2
5
4E 5F
0
1
1
2
3
-
邻接点函数的实现
int firstAdjVex(ALGragh G, int v){ p=G.vertices[v].firstarc;//v的第1个邻接点 if(!p) return -1;//无邻接点 return p->adjvex;
}
-
邻接点函数的实现
int nextAdjVex(ALGragh G, int v, int w){ p=G.vertices[v].firstarc;//v的第1个邻接点 while(p && p->adjvex != w) p=p->nextarc; if(p) p = p->nextarc;//w之后的下一个邻接点 if(p) return p->adjvex; else return -1;}
// 对v的尚未访问的邻接顶点w递归调用DFS
} // DFS
余顶点,并且使图中的每个顶点仅被访问一次的过 程。
用途:是解决图的连通性、拓扑排序和求关键路
径等算法的基础。
分类: 深度优先搜索 广度优先搜索
-
深度优先搜索
V
w1
w2
SG1
SG2
W1、W2和W3 均为 V 的邻接点,SG1、SG2
w3 和 SG3 分别为含顶点 W1、W2和W3 的子图。
SG3
-
深度优先搜索
NextAdjVex(G, v, w);
// 返回 v 的(相对于 w 的) “下一个邻接 // 点”。若 w 是 v 的最后一个邻接点,则 // 返回“空”。
-
存储结构的比较
•邻接矩阵:第v行 •邻接表:第v个链表 •十字链表:第v个链表 •多重邻接表:第v个链表
-
存储结构的比较
4、邻接边 •邻接矩阵:第v行 •邻接表:第v个链表 •十字链表:第v个链表 •多重邻接表:第v个链表
A
B
E
CD
01001 00100 00010 11000 00100
-
复习-图的存储结构
A
B
E
CD
0A 1B 2C 3D 4E
1
4
2
3
0
1
2
-
复习-图的存储结构
A
0A
B
E
1B
2C
CD
3D
4E
3
0
3
1
4
2
0
-
复习-图的存储结构
例a
b
c
d
e
1a 2b 3c 4d
5e
mark ivex ilink jvex jlink
二、存储空间
•邻接矩阵: n + n2 •邻接表用于DG和DN:n + e或者n + 2e;用于 UDG和UDN:n + 2e •十字链表: n + e •邻接多重链表: n + e
-
存储结构的比较
三、对操作的支持
1、对顶点的访问 LocateVex(G, u); //返回u的位置 GetVex(G, v); // 返回 v 的值。 PutVex(&G, u, value);// 对 u 赋值value。
1
2
3
2
5
2^
-
1 ^ 4^
3
4
3 ^5^
复习-图的存储结构
AC
B
0A
01
1B ∧
2C
2 1∧
0 2∧∧ 2 0∧∧
-
存储结构的比较
一、应用范围
•邻接矩阵可用于DG、UDG、DN、UDN •邻接表可用于DG、UDG、DN、UDN •十字链表用于DG和DN •邻接多重链表用于UDG和UDN
-
存储结构的比较
-
深度优先搜索-连通图
void DFS(Graph G, int v) {
// 从顶点v出发,深度优先搜索遍历连通图 G
visited[v] = TRUE; for(w=FirstAdjVex(G, v);
w>=0; w=NextAdjVex(G,v,w)) if (!visited[w]) DFS(G, w);
图的遍历
复习 图的遍历 深度优先搜索 广度优先搜索 课堂练习 小结和作业
-
复习-图的存ቤተ መጻሕፍቲ ባይዱ结构
B A
F
C D
E
010010 100011 000101 001001 110000 011100
-
复习-图的存储结构
B A
F
C D
E
0A
1B 2C 3D 4E 5F
1
4
0
4
5
3
5
2
5
0
1
1
2
3
-
复习-图的存储结构
V6
V7
V8
-
深度优先搜索
V1
V2
V3
V4 V8
V6
V7
-
深度优先搜索
w2
w1 V
w7
w8
w3 w4
w6
w5
-
深度优先搜索-连通图
1、从深度优先搜索遍历连通图的过程类似于树的先 根遍历 2、对图G深度优先搜索得到的顶点序列不是唯一的? 3、搜索过程中经过的边和所有的顶点构成了图的一 棵生成树。 4、如何判别V的邻接点是否被访问?
V
w1
w2
SG1
SG2
访问顶点V ;
for (W1、W2、W3 ) w3 若邻接点Wi未被访问,
则从它出发进行深度优 SG3 先搜索历。
-
深度优先搜索-连通图
V1 V2 V5 V6 V3
V4
V8
V7
深度遍历序列: V1 V2 V4 V8 V5 V6 V3 V7
-
深度优先搜索
V1
V2
V3
V4
V5
-
存储结构的比较
•邻接矩阵:修改边<v, w>(以及<w,v>) •邻接表:无向图,修改两个顶点的链表;有向图, 修改一个(或两个)顶点的链表 •十字链表:涉及两个链表 •多重邻接表:涉及两个链表
-
存储结构的比较
4、邻接点
FirstAdjVex(G, v);
// 返回 v 的“第一个邻接点” 。若该顶点 //在 G 中没有邻接点,则返回“空”。
-
存储结构的比较
2、插入和删除顶点 InsertVex(&G, v); //在图G中增添新顶点v。 DeleteVex(&G, v); // 删除G中顶点v及其相关的弧。 都要对存放顶点数组元素的操作 但是对邻接矩阵,还要修改邻接矩阵
-
存储结构的比较
3、插入和删除弧 InsertArc(&G, v, w); DeleteArc(&G, v, w);
-
用C语言描述存储结构
1、图的二个参数:
顶点个数
Vertex(Vertices),vexnum
边数(弧数) Edge(arc),arcnum,edgenum
2、图的第三个参数: 图的类型 GraphKind={DG, UDG, DN, UDN}
-
图的遍历
定义:从图中某个顶点出发游历图,访遍图中其
-
邻接点函数的实现
FirstAdjVex(G, v); //返回第1个邻接点 的位置,没有邻接点,返回-1。
NextAdjVex(G, v, w); //返回w后面的邻接
点的位置。
0A
1
4
1B
0
4
5
2C 3D
3
5
2
5
4E 5F
0
1
1
2
3
-
邻接点函数的实现
int firstAdjVex(ALGragh G, int v){ p=G.vertices[v].firstarc;//v的第1个邻接点 if(!p) return -1;//无邻接点 return p->adjvex;
}
-
邻接点函数的实现
int nextAdjVex(ALGragh G, int v, int w){ p=G.vertices[v].firstarc;//v的第1个邻接点 while(p && p->adjvex != w) p=p->nextarc; if(p) p = p->nextarc;//w之后的下一个邻接点 if(p) return p->adjvex; else return -1;}
// 对v的尚未访问的邻接顶点w递归调用DFS
} // DFS
余顶点,并且使图中的每个顶点仅被访问一次的过 程。
用途:是解决图的连通性、拓扑排序和求关键路
径等算法的基础。
分类: 深度优先搜索 广度优先搜索
-
深度优先搜索
V
w1
w2
SG1
SG2
W1、W2和W3 均为 V 的邻接点,SG1、SG2
w3 和 SG3 分别为含顶点 W1、W2和W3 的子图。
SG3
-
深度优先搜索
NextAdjVex(G, v, w);
// 返回 v 的(相对于 w 的) “下一个邻接 // 点”。若 w 是 v 的最后一个邻接点,则 // 返回“空”。
-
存储结构的比较
•邻接矩阵:第v行 •邻接表:第v个链表 •十字链表:第v个链表 •多重邻接表:第v个链表
-
存储结构的比较
4、邻接边 •邻接矩阵:第v行 •邻接表:第v个链表 •十字链表:第v个链表 •多重邻接表:第v个链表
A
B
E
CD
01001 00100 00010 11000 00100
-
复习-图的存储结构
A
B
E
CD
0A 1B 2C 3D 4E
1
4
2
3
0
1
2
-
复习-图的存储结构
A
0A
B
E
1B
2C
CD
3D
4E
3
0
3
1
4
2
0
-
复习-图的存储结构
例a
b
c
d
e
1a 2b 3c 4d
5e
mark ivex ilink jvex jlink
二、存储空间
•邻接矩阵: n + n2 •邻接表用于DG和DN:n + e或者n + 2e;用于 UDG和UDN:n + 2e •十字链表: n + e •邻接多重链表: n + e
-
存储结构的比较
三、对操作的支持
1、对顶点的访问 LocateVex(G, u); //返回u的位置 GetVex(G, v); // 返回 v 的值。 PutVex(&G, u, value);// 对 u 赋值value。
1
2
3
2
5
2^
-
1 ^ 4^
3
4
3 ^5^
复习-图的存储结构
AC
B
0A
01
1B ∧
2C
2 1∧
0 2∧∧ 2 0∧∧
-
存储结构的比较
一、应用范围
•邻接矩阵可用于DG、UDG、DN、UDN •邻接表可用于DG、UDG、DN、UDN •十字链表用于DG和DN •邻接多重链表用于UDG和UDN
-
存储结构的比较