最小生成树算及其应用.ppt

  1. 1、本文档共17页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
最小生成树算法及应用 一、生成树的概念 若图是连通的无向图或强连通的有向图,则从图中任意一个顶点出发调用一 次 bfs 或 dfs 后,便可以系统地访问图中所有顶点;若图是有根的有向图,则从根 出发通过调用一次 dfs 或 bfs ,亦可系统地访问所有顶点。在这种情况下,图中所 有顶点加上遍历过程中经过的边所构成的子图,称为原图的生成树。 对于不连通的无向图和不是强连通的有向图,若有根或者从根外的任意顶点 出发,调用一次 bfs 或 dfs 后,一般不能系统地访问所有顶点,而只能得到以出发 点为根的连通分支(或强连通分支)的生成树。要访问其它顶点,还需要从没有 访问过的顶点中找一个顶点作为起始点,再次调用 bfs 或 dfs ,这样得到的是生成 森林。 由此可以看出, 一个图的生成树是不唯一的 ,不同的搜索方法可以得到不同 的生成树,即使是同一种搜索方法,出发点不同亦可导致不同的生成树。 可以证明:具有 n 个顶点的带权连通图,其对应的生成树有 n-1 条边。 最小生成树算法及应用 最小生成树算法及应用 二、求图的最小生成树算法 严格来说,如果图 G= ( V , E )是一个连通的无向图,则把它的全部顶点 V 和 一部分边 E 构成一个子图 G ,即 G = ( V , E ),且边集 E 能将图中所有顶点连通 又不形成回路,则称子图 G 是图 G 的一棵生成树。 对于带权连通图,生成树的权即为生成树中所有边上的权值总和,权值最 小的生成树,称为图的最小生成树。 求图的最小生成树具有很高的实际应用价值,比如下面的这个例题。 最小生成树算法及应用 例 1 、城市公交网 [ 问题描述 ] 有一张城市地图,图中的顶点为城市,无向边代表两个城市间的连通关系, 边上的权为在这两个城市之间修建高速公路的造价,研究后发现,这个地图有一 个特点,即任一对城市都是连通的。现在的问题是,要修建若干高速公路把所有 城市联系起来,问如何设计可使得工程的总造价最少。 [ 输入 ] n (城市数, 1=n=100 ); e (边数); 以下 e 行,每行 3 个数 i,j,w ij ,表示在城市 i,j 之间修建高速公路的造价。 [ 输出 ] n-1 行,每行为两个城市的序号,表明这两个城市间建一条高速公路。 最小生成树算法及应用 [ 举例 ] 下面的图( A )表示一个 5 个城市的地图,图( B )、( C )是对图( A )分别进 行深度优先遍历和广度优先遍历得到的一棵生成树,其权和分别为 20 和 33 ,前者比 后者好一些,但并不是最小生成树,最小生成树的权和为 19 。 [ 问题分析 ] 出发点:具有 n 个顶点的带权连通图,其对应的生成树有 n-1 条边! 那么选哪 n-1 条边呢? 设图 G 的度为 n , G= ( V , E ) 我们介绍两种基于贪心的算法, Prim 算法和 Kruskal 算法。 最小生成树算法及应用 1 、用 Prim 算法求最小生成树的思想如下: ①设置一个顶点的集合 S 和一个边的集合 TE , S 和 TE 的初始状态均为空集; ②选定图中的一个顶点 K ,从 K 开始生成最小生成树,将 K 加入到集合 S ; ③重复下列操作,直到选取了 n-1 条边: 选取一条权值最小的边( X , Y ),其中X∈S,not (Y∈S); 将顶点 Y 加入集合 S ,边( X , Y )加入集合 TE ; ④得到最小生成树 T = ( S , TE ) 。 如何证明 Prim 算法的正确性呢?提示:用反证法。 因为操作是沿着边进行的,所以数据结构宜采用边集数组表示法。 最小生成树算法及应用 ① 从文件中读入图的邻接矩阵 g ; ② 边集数组 elist 初始化; For i:=1 To n-1 Do Begin elist[i].fromv:=1 ; elist[i].endv:=i+1 ; elist[i].weight:=g[1,i+1] ; End ; ③ 求出最小生成树的 n-1 条边; For k:=1 To n-1 Do Begin min:=maxint ; m:=k ;

文档评论(0)

jinchenl + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档