210 likes | 417 Views
数据结构讲义. 第 7 章 图. - 最小生成树. 嘉应学院 数学系. 7.4.1 无向图的连通分量和生成树. 若图是连通的或强连通的,则从图中某一个顶点出发可以访问到图中所有顶点; 若图是非连通的或非强连通图,则需从图中多个顶点出发搜索访问而每一次从一个新的起始点出发进行搜索过程中得到的顶点访问序列恰为每个连通分量中的顶点集。. A. B. A. B. C. C. D. E. F. F. G. H. J. K. I. L. M. J. E. L. D. M. G. H. K. I.
E N D
数据结构讲义 第7章 图 - 最小生成树 嘉应学院 数学系
7.4.1 无向图的连通分量和生成树 • 若图是连通的或强连通的,则从图中某一个顶点出发可以访问到图中所有顶点; • 若图是非连通的或非强连通图,则需从图中多个顶点出发搜索访问而每一次从一个新的起始点出发进行搜索过程中得到的顶点访问序列恰为每个连通分量中的顶点集。
A B A B C C D E F F G H J K I L M J E L D M G H K I
深度优先搜索遍历算法及广度优先搜索遍历算法中遍历图过程中历经边的集合和顶点集合一起构成连通图的极小连通子图。它是连通图的一颗生成树。深度优先搜索遍历算法及广度优先搜索遍历算法中遍历图过程中历经边的集合和顶点集合一起构成连通图的极小连通子图。它是连通图的一颗生成树。 生成树:是一个极小连通子图,它含有图中全部顶点,但只有n-1条边。 由深度优先搜索遍历得到的生成树,称为深度优先生成树,由广度优先搜索遍历得到的生成树,称为广度优先生成树。见下页无向图G7的两种生成树。
v0 3 1 ^ v1 v0 v1 4 2 0 ^ v2 v2 4 3 1 ^ v4 v3 v4 v3 4 2 0 ^ v4 3 2 1 ^ v3 v1 v4 v2 例1 :画出下图的生成树 邻接表 无向连通图 v0 v0 BFS生成树 v3 DFS生成树 v4 v2 v1
2.生成森林 若一个图是非连通图或非强连通图,但有若干个连通分量或若干个强连通分量,则通过深度优先搜索遍历或广度优先搜索遍历,不可以得到生成树,但可以得到生成森林,且若非连通图有 n 个顶点,m 个连通分量或强连通分量,则可以遍历得到m棵生成树,合起来为生成森林,森林中包含n-m条树边。 生成森林可以利用非连通图的深度优先搜索遍历或非连通图的广度优先搜索遍历算法得到。
A B C D E F G H K I J L M 例2:画出下图的生成森林(或极小连通子图) 这是一个无向非连通图(参见教材P170-171例) 求解步骤: Step1:先求出邻接矩阵或邻接表; Step2:写出DFS或BFS结果序列; Step3:画出对应子图或生成森林。 注:亦可由邻接矩阵或邻接表直接画出生成森林 下面选用邻接表方式来求深度优先搜索生成森林
先写出邻接表(或邻接矩阵): 1 2 5 0 A 1 2 5 11 ^ A B 12 ^ 0 12 ^ 1 B 0 ^ 2 C C 4 ^ 4 ^ 3 D F 3 ^ 4 E 0 ^ 5 F J 7 8 7 8 10 ^ 6 G L M 7 H 10 ^ 6 10 ^ 8 I 6 ^ E D 12 ^ 11 9 J 11 G H 10 K 6 7 ^ 11 L 0 9 12 ^ K I 12 M 9 11 ^ 1 9 再写出DFS结果(3次)ABMJLCF DE GHKI 最小连通! 子图1: 子图2: 子图3:
A B C F J L G M A D I H E F C B D K G H M E J K I L 子图 (或连通分量) 生成森林
首先明确: • 使用不同的遍历图的方法,可以得到不同的生成树;从不同的顶点出发,也可能得到不同的生成树。 • 按照生成树的定义,n 个顶点的连通网络的生成树有 n 个顶点、n-1 条边。 7.4.3 最小生成树 即有权图 目标: 在网络的多个生成树中,寻找一个各边权值之和最小的生成树。 • 构造最小生成树的准则 • 必须只使用该网络中的边来构造最小生成树; • 必须使用且仅使用n-1条边来联结网络中的n个顶点; • 不能使用产生回路的边。
典型用途: 欲在n个城市间建立通信网,则n个城市应铺n-1条线路;但因为每条线路都会有对应的经济成本,而n个城市可能有n(n-1)/2 条线路,那么,如何选择n–1条线路,使总费用最少? 数学模型: 顶点———表示城市,有n个; 边————表示线路,有n–1条; 边的权值—表示线路的经济代价; 连通网——表示n个城市间通信网。 显然此连通网是一个生成树! 问题抽象:n个顶点的生成树很多,需要从中选一棵代价最小的生成树,即该树各边的代价之和最小。此树便称为最小生成树MST(Minimum cost Spanning Tree)
2 1 7 5 6 9 1 2 13 5 10 6 5 4 3 3 4 7 7 5 9 13 24 10 17 12 18
普里姆算法 下面仅讨论无向网的最小生成树问题。 普里姆方法的思想是:在图中任取一个顶点K作为开始点,令U={k},W=V-U,其中V为图中所有顶点集,然后找一个顶点在U中,另一个顶点在W中的边中最短的一条,找到后,将该边作为最小生成树的树边保存起来,并将该边顶点全部加入U集合中,并从W中删去这些顶点,然后重新调整U中顶点到W中顶点的距离, 使之保持最小,再重复此过程,直到W为空集止。求解过程参见下页图。
1 1 例 5 6 1 1 5 2 4 5 5 3 3 3 3 2 4 6 6 5 6 1 1 1 1 1 1 2 4 4 1 1 2 4 5 3 3 3 2 2 3 4 2 4 4 4 5 6 6 6 6 Prim算法构造最小生成树演示 1
假设开始顶点就选为顶点1,故首先有U={1},W={2,3,4,5,6}假设开始顶点就选为顶点1,故首先有U={1},W={2,3,4,5,6} closest用于存放顶点序号 lowest存放权值
克鲁斯卡尔(kruskal)算法 1. 克鲁斯卡尔算法基本思想 克鲁斯卡尔算法的基本思想是:将图中所有边按权值递增顺序排列,依次选定取权值较小的边,但要求后面选取的边不能与前面选取的边构成回路,若构成回路,则放弃该条边,再去选后面权值较大的边,n个顶点的图中,选够n-1条边即可。 例如,对上图中无向网,用克鲁斯卡尔算法求最小生成树的过程见下图。
作业 • 请对以下的无向带权图,分别用普里姆算法和克鲁斯卡尔算法求其最小生成树,写出如讲义中的每一步的示意图。