数据结构 第七章-图2.ppt

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void DFS(Graph G, int v)
7.3 图的遍历
visited 0 0 10 20 30 40
……
{/* 从第v个顶点出发,递归地深度优先遍历图G*/
/* v是顶点在一维数组中的位置,假设G是非空图*/
visited[v] =1;
Visit(v); /*访问第v个顶点*/
for ( w=FirstAdjVex(G, v); w; w=NextAdjVex(G, v, w) )
(1)在图结构中,没有一个“自然”的首结点,图中的任 意一个顶点都可以作为第一个被访问的结点
(2)在非连通图中,从一个顶点出发,只能访问它所在的 连通分量上的所有顶点,因此,还需考虑如何选取下一个出 发点以访问图中的其余连通分量
(3)在图结构中,如果有回路存在,那么一个顶点被访问 后,有可能沿回路又回到该顶点,考虑如何避免重复访问
7^
V0 V4
V2
V5
V6
V0 V1 V2 V3 V4 V7 V5 V6
V0 V1 V2 V3 V4 V7 V5 V6
12
void BFSTraverse(MGraph G)
7.3 图的遍历
/*从v出发,广度优先遍历连通图G*/
if (!visited[w]) DFS(G, w);
/*对v的尚未访问的邻接顶点w递归调用DFS*/
} 6
在邻接表存储结构上实现深度优先搜索: void DFSTraverseAL(ALGraph G) /*深度优先遍历以邻接表存储的图G*/ {int i; for (i=0;i<G.vexnum; ++ i)
/* 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*/
visited[i]=0; /*标志数组初始化*/ for(i=0;i<G.vexnum;++i)
if (!visited[i]) DFSAL(G,i); /*Vi未访问过,从Vi开始DFS搜索*/
}
7.3 图的遍历
7
7.3 图的遍历
void DFSAL(ALGraph G, int i) {/*从第v个顶点出发,递归地深度优先遍历图G*/
当以邻接表做图的存储结构时,找邻接点所需时间为O(e), 其中e为无向图中边的数或有向图中弧的数。因此,当以邻 接表做存储结构时,深度优先搜索遍历图的时间复杂度为 O(n+e)。
9
7.3.2 广度优先遍历
7.3 图的遍历
图中某顶点v出发:
1)访问顶点v ;
2)访问v的所有未被访问的邻接点w1 ,w2 , …wk ; 3)依次从这些邻接点出发,访问它们的所有未被访问的邻
第7章 图
图是一种多对多的结构关系,每个元素可以有零个或多 个直接前趋;零个或多个直接后继。
2020/12/11
1
【重点掌握】: 1. 图的两种遍历方法:遍历的定义、深度优先搜索遍历和
广度优先搜索遍历的算法; 2. 应用图的遍历算法判断图的连通性及求图的生成树; 3. 用Prim、Kruskal算法求图的最小生成树; 4. 用Dijkstra算法求解单源最短路径问题;用Floyd算法求
接点; 依此类推,直到图中所有访问过的顶点的邻接点 都被访问;
10
※求图G以V0为起点的的广度优先序列(设存储结构为邻 接矩阵)
V0,V1,V2, V3,V4,V7,V5,V6
VV0
VV1
V22
VV3
VV4
VV5
VV6
VV7
若图的存储结构为邻接表,则 访问邻接点的顺序不唯一,
深度优先序列不是唯一的
所有顶点间的最短路径问题; 5. 利用AOV网进行拓扑排序;利用AOE网求关键路径问题; 【掌 握】: 1. 掌握图的定义和术语; 2. 图的各种存储结构及其构造算法、在实际问题中的求解
效率。
2
7.3 图的遍历
7.3 图的遍历:从图的某顶点出发,访问图中所有顶点, 并且每个顶点仅访问一次。
图结构的遍历复杂性:
4
※求图G以V0为起点的的深度优先序列(设存储结构为邻接 矩阵)
V0,V1,V3,V4,V7,V2,V5,V6,
VV0
VV1
VV2
VV3
VV44
VV5
VV6
VV7
若图的存储结构为邻接表,则 访问邻接点的顺序不唯一, 深度优先序列不是唯一的
5
深度优先遍历算法: 辅助数组:int visited[Max_Vertex_Num] ; 访问标志数组,全局变量,初始时所有分量 全为0,visited[v]=1表示顶点v已被访问.
} }/*DFSAL*/
8
7.3 图的遍历
在遍历时,对图中每个顶点至多调用一次DFS函数,因为 一旦某个顶点被标志成已被访问,就不再从它出发进行搜索。 因此,遍历图的过程实质上是对每个顶点查找其邻接点的过 程。其耗费的时间则取决于所采用的存储结构。
用邻接矩阵做图的存储结构时,查找各个顶点的邻接点所 需的时间为O(n2),其中n为图中顶点数。当以邻接矩阵做存 储结构时,深度优先搜索遍历图的时间复杂度为O(n2+n)。
∵ 先被访问的顶点,其 邻接点也要先被访问
∴设一队列保存已访问的 顶点
11
※ 在邻接表存储结构上的广度优先搜索
data firstarc
0 V0
1
adjvex next 2^
1 V1
ຫໍສະໝຸດ Baidu
0
3
4
2 V2
0
5
6^
3 V3
1^
4 V4
1
5 V5
2
6 V6
2
7 V7
1
7^ 6^ 5^ 4^
V1 V3
V7
Q
7.3 图的遍历
(4)在图结构中,一个顶点可以和其他多个顶点邻接,当 这样的顶点访问过后,考虑如何选取下一个要访问的顶点的 问题
3
图的遍历方法有深度优先遍历和广度优先遍历两种。 7.3.1 深度优先搜索 方法: (1)从图的某一顶点V0出发,访问此顶点; (2)依次从V0的未被访问的邻接点出发,深度优先遍历图, 直至图中所有和V0相通的顶点都被访问到。 若此时图中尚 有顶点未被访问,则另选图中一个未被访问的顶点作起点, 重复上述过程,直至图中所有顶点都被访问到。
相关文档
最新文档