数据结构nbsp第七章.pptVIP

  • 1
  • 0
  • 约1.48万字
  • 约 84页
  • 2020-12-08 发布于黑龙江
  • 举报
广度优先搜索示例 广度遍历顶点访问序列: V1 →V2 → V3 →V4 → V5 → V6 →V7 →V8 广度优先搜索算法 void BFSTraverse(Graph G){ //对图G作广度优先遍历 for (v=0; vG.vexnum; ++v) //访问标志数组初始化 visited[v] = FALSE; InitQueue(Q); //初始化队列 for (v=0; vG.vexnum; ++v) if(!visited[v]) { visited[v] = TRUE; visit(v); //访问第v个顶点 EnQueue( Q, v); while(!QueueEmpty(Q)) { DeQueue(Q, u); for(w = FirstAdjVex(G,v); w = 0; w = NextAdjVex(G,v,w)) if( !visited[w]) { visited[w] = TRUE; visit(w); EnQueue( Q, v); }//if }//while }//if }//BFSTraverse 算法分析: 同深度遍历一样,广度遍历图的过程实质上也是对每个顶点查找其邻接点的过程。 广度遍历图的时间复杂度和深度遍历图相同,两者不同之处仅仅在于对顶点访问的顺序不同。 返回 四、最小生成树 1.无向图的连通分量 2.无向图的生成树 3.最小生成树 返回 无向图遍历时,对于连通图,仅需从图中任一顶点出发,进行深度优先搜索或广度优先搜索,便可访问到图中所有顶点。对于非连通图,则需从多个顶点出发进行搜索,而每一次从一个新的起始点出发进行搜索过程中得到的顶点访问序列恰为其各个连通分量的顶点集。 1.无向图的连通分量 广度遍历顶点访问序列: V1V2V3V4V5V6V7V8 对上图进行深度优先搜索遍历,3次调用DFS过程(分别从顶点A、D和G出发)得到的访问序列为: ABMJLCF DE GHKI 注:从图中的某一顶点出发得到的遍历序列不是唯一的,但若根据其存储结构进行遍历,得到的遍历序列是唯一的。 返回 2.无向图的生成树 假设E(G)为连通图G中所有边的集合,则从图中任一顶点出发遍历图时,必将E(G)分成两个集合T(G)和B(G),其中T(G)是遍历过程中历经的边的结合;B(G)是剩余的边的集合。则边集T(G)和图G中所有顶点一起构成连通图G的一棵生成树。 使用不同的遍历图的方法,可以得到不同的生成树(如深度优先生成树、广度优先生成树);从不同的顶点出发,也可能得到不同的生成树。 对于非连通图,每个连通分量的顶点集,和遍历时走过的边一起构成若干棵生成树,这些连通分量的生成树组成非连通图的生成森林。 生成树的说明 一个图可以有许多棵不同的生成树; 所有生成树具有以下共同特点: (1)生成树的顶点个数与图的顶点个数相同 (2)生成树是图的极小连通子图 (3)一个有n个顶点的连通图的生成树有n-1条边 (4)生成树中任意两个顶点间的路径是唯一的 (5)在生成树中再加一条边必然形成回路 含n个顶点n-1条边的图不一定是生成树 设以孩子兄弟链表作存储结构,设计算法求非连通图的深度优先生成森林。 void DFSForest( Graph G, CSTree T ){ //建立无向图G的深度优先森林的孩子兄弟链表T T = NULL; for( v = 0; v G.vexnum; v++ ) visited[v] = FALSE; for( v = 0; v G.vexnum; v++) if( !visited[v]) { p = (CSTree) malloc (sizeof(CSNode)); //分配根结点 *p = { GetVex(G, v), NULL, NULL }; if( !T

文档评论(0)

1亿VIP精品文档

相关文档