1、图的遍历 从图中某顶点出发 沿一些边访问图中顶点 使每个顶点都被访问到 且仅被访问一次 叫做图的遍历无重复 无遗漏关键点图中可能存在回路图的顶点可能与其它顶点相通 在访问完某顶点后 可能沿着某些边回到曾经访问过的顶点为避免重复访问 可设辅助数组visited 将其初始化为0遍历时 如果某顶点i被访问 将visited i 置为1以此防止顶点i被多次访问 图的深度优先搜索 DFS DFS V1 V2 V4 V8 V5 V3 V6 V7 图的深度优先搜索 DFS DFS V1 V2 V4 V8 V3 V6 V7 V5 DFS V1 V3 V7 V6 V2 V4 V8 V5 4 图的深度优先遍历 D
2、FS 类似树的深度遍历设初始状态 图中所有顶点都没被访问过从图中某一顶点v0出发 访问v0 然后访问与v0邻接 但未被访问过的任一顶点v1接着访问与v1邻接 但未被访问过的任意顶点V2当达到某顶点时 发现其所有邻接顶点均被访问过 则退回到最近被访问过的前一顶点若它还有邻接点未被访问过 从未被访问过的顶点中 任取一顶点 重复这一过程若所有邻接顶点被访问过 则再回退如此重复 直到所有顶点均被访问过为止 5 在遍历的过程中需要辅助数组 visited 1 n 记录每个结点访问标志递归算法 非递归算法 图的深度优先遍历算法 8 类似于树的层次遍历假设初始状态是图中所有顶点都没被访问过从图中某一顶点v0
3、出发 访问v0然后访问v0的全部邻接点w1 w2 wt再从这些被访问的顶点出发 逐次访问它们的邻接点 已被访问的顶点除外 依此类推 直到所有顶点都被访问为止 图的广度优先搜索 BFS 9 BFS V1 V2 V3 V4 V5 V6 V7 V8 图的广度优先搜索 BFS BFS V1 V2 V3 V4 V6 V7 V8 V5 10 在遍历的过程中需要辅助数组 visited 1 n 记录每个结点访问标志以队列为辅助存储空间 图的广度优先搜索算法 11 连通图 从图中任一顶点出发 便可遍历图非连通图 从图中任一顶点出发 不能访问到所有顶点 只能访问图的一个连通分量怎样求图的连通分量 调用DFS或B
4、FS 检查图的顶点若被访问过 则该顶点落在已被求过的连通分量上若未被访问过 则从该顶点出发遍历图 可求得图的另一个连通分量 图的连通性 非连通图的遍历 voidtravel inti for i 0 i n i visited i FALSE for i 0 i n i if visited i dfs i 如果DFS算法只被调用一次 则图是连通图若被调用多次 则得到多个连通分量 生成树 图论中 常常将无回路的连通图定义为树 图的生成树 生成树连通图G的极小连通子图 称为图的生成树包含图中所有的顶点无回路n个顶点 只有n 1条边任意去掉一条边 图将变成非连通图添加一条边 图中将出现回路含n个顶
5、点n 1条边的图不一定是生成树 15 连通无向图的生成树 设G V E 是一个连通图则从图中任一顶点出发 遍历图G时 将E分成两个集合T G 和B G 其中T G 是遍历图时通过的边集 B G 是剩余的边集显然 T G 与图G中所有顶点一起构成G的极小连通子图它是连通图的一棵生成树由DFS得到的是深度优先生成树由BFS得到的为广度优先生成树 16 深度遍历 V1 V2 V4 V8 V5 V3 V6 V7 广度遍历 V1 V2 V3 V4 V5 V6 V7 V8 17 非连通图 每个连通分量中的顶点集和遍历时走过的边一起构成若干棵生成树这些连通分量的生成树组成非连通图的生成森林 非连通图的生成树 图的生成树 图的生成树不是唯一的从不同的顶点出发 能得到不同的生成树连通网络G V E 各边带权生成树各边带权生成树的权生成树各边权值的和最小生成树权值最小的生成树 最小生成树 问题提出在n个城市间建立通信网络顶点 表示城市权 城市间建立通信线路所需花费代价希望找到一条路径 使建立该通信网所需花费的总代价最小路径上各边权值的和最小 问题分析n个城市间 最多可设置n n 1 2条线路n个城市间建立通信网 只需n 1条线路如何在可能的线路中选择n 1条边 把所有城市连起来 且总耗费 各边权值之和 最小找图中的最小生成树