最小生成树算法及应用-文档资料_第1页
最小生成树算法及应用-文档资料_第2页
最小生成树算法及应用-文档资料_第3页
最小生成树算法及应用-文档资料_第4页
最小生成树算法及应用-文档资料_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1最小生成树算法及应用最小生成树算法及应用 一、生成树的概念一、生成树的概念 若图是连通的无向图或强连通的有向图,则从图中任意一个顶点出发调用一若图是连通的无向图或强连通的有向图,则从图中任意一个顶点出发调用一次次bfsbfs或或dfsdfs后,便可以系统地访问图中所有顶点;若图是有根的有向图,则从根后,便可以系统地访问图中所有顶点;若图是有根的有向图,则从根出发通过调用一次出发通过调用一次dfsdfs或或bfsbfs,亦可系统地访问所有顶点。在这种情况下,图中所,亦可系统地访问所有顶点。在这种情况下,图中所有顶点加上遍历过程中经过的边所构成的子图,称为原图的生成树。有顶点加上遍历过程中经过的

2、边所构成的子图,称为原图的生成树。 对于不连通的无向图和不是强连通的有向图,若有根或者从根外的任意顶点对于不连通的无向图和不是强连通的有向图,若有根或者从根外的任意顶点出发,调用一次出发,调用一次bfsbfs或或dfsdfs后,一般不能系统地访问所有顶点,而只能得到以出发后,一般不能系统地访问所有顶点,而只能得到以出发点为根的连通分支(或强连通分支)的生成树。要访问其它顶点,还需要从没有点为根的连通分支(或强连通分支)的生成树。要访问其它顶点,还需要从没有访问过的顶点中找一个顶点作为起始点,再次调用访问过的顶点中找一个顶点作为起始点,再次调用bfsbfs或或dfsdfs,这样得到的是生成,这样

3、得到的是生成森林。森林。 由此可以看出,由此可以看出,一个图的生成树是不唯一的一个图的生成树是不唯一的,不同的搜索方法可以得到不同,不同的搜索方法可以得到不同的生成树,即使是同一种搜索方法,出发点不同亦可导致不同的生成树。的生成树,即使是同一种搜索方法,出发点不同亦可导致不同的生成树。 可以证明:具有可以证明:具有n n个顶点的带权连通图,其对应的生成树有个顶点的带权连通图,其对应的生成树有n-1n-1条边。条边。 2最小生成树算法及应用最小生成树算法及应用 3最小生成树算法及应用最小生成树算法及应用 二、二、求图的最小生成树算法求图的最小生成树算法 严格来说,如果图严格来说,如果图G=G=(

4、V V,E E)是一个连通的无向图,则把它的全部顶点)是一个连通的无向图,则把它的全部顶点V V和和一部分边一部分边EE构成一个子图构成一个子图GG,即,即G=G=(V V, EE),且边集),且边集EE能将图中所有顶能将图中所有顶点连通又不形成回路,则称子图点连通又不形成回路,则称子图GG是图是图G G的一棵生成树。的一棵生成树。 对于带权连通图,生成树的权即为生成树中所有边上的权值总和,权值最对于带权连通图,生成树的权即为生成树中所有边上的权值总和,权值最小的生成树,称为图的最小生成树。小的生成树,称为图的最小生成树。 求图的最小生成树具有很高的实际应用价值,比如下面的这个例题。求图的最小

5、生成树具有很高的实际应用价值,比如下面的这个例题。 4最小生成树算法及应用最小生成树算法及应用 例例1 1、城市公交网、城市公交网 问题描述问题描述 有一张城市地图,图中的顶点为城市,无向边代表两个城市间的连通关系,边有一张城市地图,图中的顶点为城市,无向边代表两个城市间的连通关系,边上的权为在这两个城市之间修建高速公路的造价,研究后发现,这个地图有一个特上的权为在这两个城市之间修建高速公路的造价,研究后发现,这个地图有一个特点,即任一对城市都是连通的。现在的问题是,要修建若干高速公路把所有城市联点,即任一对城市都是连通的。现在的问题是,要修建若干高速公路把所有城市联系起来,问如何设计可使得工

6、程的总造价最少。系起来,问如何设计可使得工程的总造价最少。 输入输入 n n(城市数,(城市数,1=n=1001=n=100);); e e(边数);(边数); 以下以下e e行,每行行,每行3 3个数个数i,j,wi,j,wijij,表示在城市,表示在城市i,ji,j之间修建高速公路的造价。之间修建高速公路的造价。 输出输出 n-1 n-1行,每行为两个城市的序号,表明这两个城市间建一条高速公路。行,每行为两个城市的序号,表明这两个城市间建一条高速公路。 5最小生成树算法及应用最小生成树算法及应用 举例举例 下面的图(下面的图(A A)表示一个)表示一个5 5个城市的地图,图(个城市的地图,

7、图(B B)、()、(C C)是对图()是对图(A A)分别进)分别进行深度优先遍历和广度优先遍历得到的一棵生成树,其权和分别为行深度优先遍历和广度优先遍历得到的一棵生成树,其权和分别为2020和和3333,前者比,前者比后者好一些,但并不是最小生成树,最小生成树的权和为后者好一些,但并不是最小生成树,最小生成树的权和为1919。 问题分析问题分析 出发点:具有出发点:具有n n个顶点的带权连通图,其对应的生成树有个顶点的带权连通图,其对应的生成树有n-1n-1条边!条边! 那么选哪那么选哪n-1n-1条边呢?条边呢? 设图设图G G的度为的度为n n,G=G=(V V,E E) 我们介绍两种

8、基于贪心的算法,我们介绍两种基于贪心的算法,PrimPrim算法和算法和KruskalKruskal算法。算法。 6最小生成树算法及应用最小生成树算法及应用 1 1、用、用PrimPrim算法求最小生成树的思想如下:算法求最小生成树的思想如下:设置一个顶点的集合设置一个顶点的集合S S和一个边的集合和一个边的集合TETE,S S和和TETE的初始状态均为空集;的初始状态均为空集;选定图中的一个顶点选定图中的一个顶点K K,从,从K K开始生成最小生成树,将开始生成最小生成树,将K K加入到集合加入到集合S S;重复下列操作,直到选取了重复下列操作,直到选取了n-1n-1条边:条边: 选取一条权

9、值最小的边(选取一条权值最小的边(X X,Y Y),其中),其中XSXS,not (YS)not (YS); 将顶点将顶点Y Y加入集合加入集合S S,边(,边(X X,Y Y)加入集合)加入集合TETE;得到最小生成树得到最小生成树T =T =(S S,TETE) 。 如何证明如何证明PrimPrim算法的正确性呢?提示:用反证法。算法的正确性呢?提示:用反证法。 因为操作是沿着边进行的,所以数据结构宜采用边集数组表示法。因为操作是沿着边进行的,所以数据结构宜采用边集数组表示法。 7最小生成树算法及应用最小生成树算法及应用 从文件中读入图的邻接矩阵从文件中读入图的邻接矩阵g g; 边集数组边

10、集数组elistelist初始化;初始化;For i:=1 To n-1 Do For i:=1 To n-1 Do Begin Begin elisti.fromv:=1 elisti.fromv:=1;elisti.endv:=i+1elisti.endv:=i+1;elisti.weight:=g1,i+1elisti.weight:=g1,i+1; EndEnd; 求出最小生成树的求出最小生成树的n-1n-1条边;条边; For k:=1 To n-1 DoFor k:=1 To n-1 Do Begin Begin min:=maxint min:=maxint;m:=km:=k;

11、For j:=k To n-1 Do For j:=k To n-1 Do 查找权值最小的一条边查找权值最小的一条边 If elistj.weightmin Then Begin min:=elistj.weight If elistj.weightmin Then Begin min:=elistj.weight;m:=jm:=j;EndEnd; If mk Then Begin t:=elistkIf mk Then Begin t:=elistk;elistk:=elistmelistk:=elistm;elistm:=telistm:=t;EndEnd; 把权值最小的边调到第把权值最小

12、的边调到第k k个单元个单元 j:=elistk.endv j:=elistk.endv; jj为新加入的顶点为新加入的顶点 For i:=k+1 To n-1 Do For i:=k+1 To n-1 Do 修改未加入的边集修改未加入的边集 Begin s:=elisti.endv Begin s:=elisti.endv; w:=gj,sw:=gj,s; If welisti.weight Then Begin elisti.weight:=wIf welisti.weight Then Begin elisti.weight:=w;elisti.fromv:=jelisti.fromv:

13、=j;EndEnd; EndEnd; EndEnd; 输出;输出; PrimPrim算法的实现算法的实现8最小生成树算法及应用最小生成树算法及应用 2 2、用、用KruskalKruskal算法求最小生成树的思想如下:算法求最小生成树的思想如下: 设最小生成树为设最小生成树为T=T=(V V,TETE),设置边的集合),设置边的集合TETE的初始状态为空集。将图的初始状态为空集。将图G G中的中的边按权值从小到大排好序,然后从小的开始依次选取,若选取的边使生成树边按权值从小到大排好序,然后从小的开始依次选取,若选取的边使生成树T T不形不形成回路,则把它并入成回路,则把它并入TETE中,保留作

14、为中,保留作为T T的一条边;若选取的边使生成树形成回路,的一条边;若选取的边使生成树形成回路,则将其舍弃;如此进行下去,直到则将其舍弃;如此进行下去,直到TETE中包含中包含n-1n-1条边为止。最后的条边为止。最后的T T即为最小生成树。即为最小生成树。 如何证明呢?如何证明呢? 9最小生成树算法及应用最小生成树算法及应用 Kruskal Kruskal算法在实现过程中的关键和难点在于:如何判断欲加入的一条边算法在实现过程中的关键和难点在于:如何判断欲加入的一条边是否与生成树中已保留的边形成回路?是否与生成树中已保留的边形成回路? 我们可以将顶点划分到不同的集合中,每个集合中的顶点表示一个

15、无回路我们可以将顶点划分到不同的集合中,每个集合中的顶点表示一个无回路的连通分量,很明显算法开始时,把所有的连通分量,很明显算法开始时,把所有n n个顶点划分到个顶点划分到n n个集合中,每个集合个集合中,每个集合只有一个顶点,表明顶点之间互不相通。当选取一条边时,若它的两个顶点分只有一个顶点,表明顶点之间互不相通。当选取一条边时,若它的两个顶点分属于不同的集合,则表明此边连通了两个不同的连通分量,因每个连通分量无属于不同的集合,则表明此边连通了两个不同的连通分量,因每个连通分量无回路,所以连通后得到的连通分量仍不会产生回路,因此这条边应该保留,且回路,所以连通后得到的连通分量仍不会产生回路,

16、因此这条边应该保留,且把它们作为一个连通分量,即把它的两个顶点所在集合合并成一个集合。如果把它们作为一个连通分量,即把它的两个顶点所在集合合并成一个集合。如果选取的一条边的两个顶点属于同一个集合,则此边应该舍弃,因为同一个集合选取的一条边的两个顶点属于同一个集合,则此边应该舍弃,因为同一个集合中的顶点是连通无回路的,若再加入一条边则必然产生回路。中的顶点是连通无回路的,若再加入一条边则必然产生回路。 就是并查集的思想。就是并查集的思想。10最小生成树算法及应用最小生成树算法及应用 将图的存储结构转换成边集数组表示的形式将图的存储结构转换成边集数组表示的形式elistelist,并按照权值从小到

17、大排好序;,并按照权值从小到大排好序; 设数组设数组C1.n-1C1.n-1用来存储最小生成树的所有边,用来存储最小生成树的所有边,CiCi是第是第i i次选取的可行边在排好序的次选取的可行边在排好序的elistelist中的下标;中的下标; 设一个数组设一个数组S1.nS1.n,SiSi都是集合,初始时都是集合,初始时Si= i Si= i 。 i:=1i:=1; 获取的第获取的第i i条最小生成树的边条最小生成树的边 j:=1 j:=1; 边集数组的下标边集数组的下标 While i=n-1 Do While i=n-1 Do Begin Begin For k:=1 To n Do Be

18、gin For k:=1 To n Do Begin 取出第取出第j j条边,记下两个顶点分属的集合序号条边,记下两个顶点分属的集合序号 If elistj.fromv in sk Then m1:=k If elistj.fromv in sk Then m1:=k; If elistj.endv in sk Then m2:=kIf elistj.endv in sk Then m2:=k; EndEnd; If m1m2 Then Begin If m1m2 Then Begin 找到的找到的elistelist第第j j条边满足条件,作为第条边满足条件,作为第i i条边保留条边保留 C

19、i:=j Ci:=j;i:=i+1i:=i+1; sm1:=sm1+sm2sm1:=sm1+sm2; 合并两个集合合并两个集合 sm2:= sm2:= ; 另一集合置空另一集合置空 End End; j:=j+1j:=j+1; 取下条边,继续判断取下条边,继续判断 End End; 输出最小生成树的各边:输出最小生成树的各边:elistCi elistCi KruskalKruskal算法的实现算法的实现11最小生成树算法及应用最小生成树算法及应用 二、二、求图的最小生成树算法小结求图的最小生成树算法小结 都是基于贪心算法都是基于贪心算法时间复杂度均为时间复杂度均为O O(n n* *n n)

20、 PrimPrim算法和算法和KruskalKruskal算法算法三、应用举例三、应用举例例例2 2、最优布线问题(、最优布线问题(wire.?wire.?) 学校有学校有n n台计算机,为了方便数据传输,现要将它们用数据线连接起来。两台计算机被连接是指它们时台计算机,为了方便数据传输,现要将它们用数据线连接起来。两台计算机被连接是指它们时间有数据线连接。由于计算机所处的位置不同,因此不同的两台计算机的连接费用往往是不同的。间有数据线连接。由于计算机所处的位置不同,因此不同的两台计算机的连接费用往往是不同的。 当然,如果将任意两台计算机都用数据线连接,费用将是相当庞大的。为了节省费用,我们采用

21、数据当然,如果将任意两台计算机都用数据线连接,费用将是相当庞大的。为了节省费用,我们采用数据的间接传输手段,即一台计算机可以间接的通过若干台计算机(作为中转)来实现与另一台计算机的连接。的间接传输手段,即一台计算机可以间接的通过若干台计算机(作为中转)来实现与另一台计算机的连接。 现在由你负责连接这些计算机,你的任务是使任意两台计算机都连通(不管是直接的或间接的)。现在由你负责连接这些计算机,你的任务是使任意两台计算机都连通(不管是直接的或间接的)。 输入格式输入格式 输入文件第一行为整数输入文件第一行为整数n n(2=n=1002=n0 then cp:=1 else cp:=-1;nend;cpnfunction dist(a,b:integer):longint; 计算第a条机器蛇和第b条机器蛇间的距离,若ab之间有屏蔽,则距离设为无穷大 nvarn i:integer;nbeginn dist:=oo;n for i:=1 to m do 如果a到b穿过第i个屏蔽,则返回无穷大 n if (cp(w1i,w2i,sa)*cp(w1i,w2i,sb)=-1) andn (cp(sa,sb,w1i)*cp(sa,sb,w2i)=-

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论