第八章-贪心算法

合集下载

贪心算法(图算法)

贪心算法(图算法)

1
4
6
3 2
5
13
最小生成树
并查集
✓ Union-Find Set ✓ 一种树型数据结构,用于处理一些不相交集合
(Disjoint Sets)的合并及查询问题 ✓ 在使用中常常以森林来表示 ✓ 可以把图中每个连通分量看成一个集合,该集合包含了
连通分量中的所有点,图的所有连通分量可以用若干个 不相交的集合来表示
9
最小生成树
Prim算法
✓练习:公路造价
【输入格式】 第一行两个数v(v<=200)和e分别代表城市数和边数,以 下e行,每行为两个顶点和它们之间的边权w(w<1000)。 【输出格式】 v-1行,每行为两个城市的序号,表明这两个城市间建一 条公路,再加该公路的造价。
10
最小生成树
Prim算法
14
最小生成树
并查集
✓ 将编号分别为1…N的N个对象划分为不相交集合,在每 个集合中,选择其中某个元素代表所在集合
✓ 常见操作: 合并两个集合 查找某元素属于哪个集合 判断两个元素是否属于同一个集合
15
最小生成树
并查集
✓ 三个基本操作
make_set(x):把每一个元素初始化为一个集合 find_set(x):查找一个元素所在的集合。在执行查找操作时,要
✓ 用来求最短路径的图中不能存在负权边
✓ 引入了松弛(Relaxation)操作:先让源点s到顶点i的距 离d[i]取一个很大的值,然后不断减小d[i],当所有的 d[i]不能再减小时,就求出了s到所有点的最短路径。松 弛操作的目的是减小d[i]的值,如果从s到达i有更优的 路径则更新d[i]
36
单源最短路径
代码
分析

贪心算法贪婪算法

贪心算法贪婪算法
13
编码结果:
a:00 b:110 c:10 d:111 e:01 共需:
2 20+3 7+2 10 +3 4+2 18=129bit
59 x4
1
0
38 x3
0
1
20
18
a
e
21 x2
1
0 11 x1
0
1
10
7
4
c
b
d
14
多机调度问题
多机调度问题要求给出一种作业调度方案,使所给 的n个作业在尽可能短的时间内由m台机器加工处理完
26 26 , 27 27 , 28 28, 29 29 , 210 2210 , 211 211, 212 212
时的运行时间与MATLAB自带的矩阵相乘的运
行时间,绘制时间对比图。
18
成。 约定,每个作业均可在任何一台机器上加 工处理,但未完工前不允许中断处理。作业 不能拆分成更小的子作业。
这个问题是NP完全问题,到目前为止还没有有效的解法。 对于这一类问题,用贪心选择策略有时可以设计出较好 的近似算法。
15
多机调度问题
采用最长处理时间作业优先的贪心选择策略可以设 计出解多机调度问题的较好的近似算法。
在选择装入背包的物品时,对每种物品i只有2种选择,即装入背 包或不装入背包。不能将物品i装入背包多次,也不能只装入部 分的物品i。
4
❖ 背包问题:
与0-1背包问题类似,所不同的是在选择物品i装入背包时, 可以选择物品i的一部分,而不一定要全部装入背包,1≤i≤n。
这2类问题极为相似,但背包问题可以用贪心算法求 解,而0-1背包问题却不能用贪心算法求解。
6

贪心算法——精选推荐

贪心算法——精选推荐

贪⼼算法1、如何理解贪⼼算法贪⼼算法的思想是:每次都做出当前最优的选择,通过多步选择得出最终的最优解。

它适合解决上⼀步的选择不会影响下⼀步的选择的问题。

如果上⼀步的选择会影响下⼀步的选择,则使⽤贪⼼算法不⼀定能求出最优解。

1.1 能够使⽤贪⼼算法求解的问题举例问题:假如我们有⼀个能够容纳100Kg物品的袋⼦,可以装各种物品,不管物品的体积。

现在我们有5种⾖⼦,每种⾖⼦的总重量和总价值各不相同。

那如何往背包⾥⾯装这些⾖⼦,使得最后背包⾥物品的总价值最⼤呢?我们⼀眼就能知道这个问题的解法,先求出每种⾖⼦的单价,然后从单价⾼的⾖⼦开始装,装完单价⾼的,再去装次⾼的,直到袋⼦装满为⽌。

这个问题就适合⽤贪⼼算法来解,实际上上⾯的做法体现的就是贪⼼算法的思想(每次都做出当前最优的选择)。

这⾥第⼀步选择装单价最⾼的⾖⼦之后,不会影响第⼆步去选择装次⾼的⾖⼦的选择,同样第⼆步也不会影响第三步去选择单价排名第三的⾖⼦。

1.2 不能使⽤贪⼼算法来求解的问题举例问题:假如我们要在⼀个有权图中,从顶点S开始,找⼀条到顶点T的最短路径。

贪⼼算法的解决思路是,每次都选择⼀条根当前顶点相连的权最⼩的边(每次都做出当前最优的选择),直到找到顶点T。

按照这种思路,我们求出的最短路径是S->A->E->T,路径长度1+4+4=9;⽽实际的最短路径是S->B->D->T,路径长度2+2+2=6 。

为什么这⾥贪⼼算法得不到最优解呢?我们第⼀步从S->A和第⼀步从S->B,下⼀步⾯对的顶点和边是不⼀样的。

也就是我们前⾯的选择会影响后⾯的选择,所以得不出最优解。

⽐如:钱币找零'''假设现在市⾯上有 6 种不同⾯值的硬币,各硬币的⾯值分别为 5 分、1 ⾓、2 ⾓、5 ⾓、1 元、2 元,要找零 10.5 元,求出最少硬币的数量。

'''def getChange(coins, amount):coins.sort();# 从⾯值最⼤的硬币开始遍历i = len(coins)-1while i >= 0:if amount >= coins[i]:n = int(amount // coins[i])change = n * coins[i]amount -= changeprint (n, coins[i])i -= 1getChange([0.05,0.1,0.2,0.5,1.0,2.0], 10.5)再⽐如:使⽤贪⼼算法实现哈夫曼编码3.1 什么是哈夫曼编码哈夫曼编码是⼀种⼗分有效的编码⽅法,⼴泛应⽤于数据压缩中,其压缩率通常在20%~90%之间。

五大常用算法之三:贪心算法

五大常用算法之三:贪心算法

五⼤常⽤算法之三:贪⼼算法贪⼼算法的定义:贪⼼算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解。贪⼼算法不是对所有问题都能得到整体最优解,关键是贪⼼策略的选择,选择的贪⼼策略必须具备⽆后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。解题的⼀般步骤是:1.建⽴数学模型来描述问题;2.把求解的问题分成若⼲个⼦问题;3.对每⼀⼦问题求解,得到⼦问题的局部最优解;4.把⼦问题的局部最优解合成原来问题的⼀个解。如果⼤家⽐较了解动态规划,就会发现它们之间的相似之处。最优解问题⼤部分都可以拆分成⼀个个的⼦问题,把解空间的遍历视作对⼦问题树的遍历,则以某种形式对树整个的遍历⼀遍就可以求出最优解,⼤部分情况下这是不可⾏的。贪⼼算法和动态规划本质上是对⼦问题树的⼀种修剪,两种算法要求问题都具有的⼀个性质就是⼦问题最优性(组成最优解的每⼀个⼦问题的解,对于这个⼦问题本⾝肯定也是最优的)。动态规划⽅法代表了这⼀类问题的⼀般解法,我们⾃底向上构造⼦问题的解,对每⼀个⼦树的根,求出下⾯每⼀个叶⼦的值,并且以其中的最优值作为⾃⾝的值,其它的值舍弃。⽽贪⼼算法是动态规划⽅法的⼀个特例,可以证明每⼀个⼦树的根的值不取决于下⾯叶⼦的值,⽽只取决于当前问题的状况。换句话说,不需要知道⼀个节点所有⼦树的情况,就可以求出这个节点的值。由于贪⼼算法的这个特性,它对解空间树的遍历不需要⾃底向上,⽽只需要⾃根开始,选择最优的路,⼀直⾛到底就可以了。话不多说,我们来看⼏个具体的例⼦慢慢理解它:1.活动选择问题 这是《算法导论》上的例⼦,也是⼀个⾮常经典的问题。有n个需要在同⼀天使⽤同⼀个教室的活动a1,a2,…,an,教室同⼀时刻只能由⼀个活动使⽤。每个活动ai都有⼀个开始时间si和结束时间fi 。⼀旦被选择后,活动ai就占据半开时间区间[si,fi)。如果[si,fi]和[sj,fj]互不重叠,ai和aj两个活动就可以被安排在这⼀天。该问题就是要安排这些活动使得尽量多的活动能不冲突的举⾏。例如下图所⽰的活动集合S,其中各项活动按照结束时间单调递增排序。

数学模型-贪心算法及实例PPT课件

数学模型-贪心算法及实例PPT课件
9
活动安排问题
设有n个活动的集合E={1,2,…,n},其中每个活动都要求 使用同一资源,如演讲会场等,而在同一时间内只有一个 活动能使用这一资源。每个活动i都有一个要求使用该资源 的起始时间si和一个结束时间fi,且si <fi 。如果选择了活动 i,则它在半开时间区间[si, fi)内占用资源。若区间[si, fi)与 区间[sj, fj)不相交,则称活动i与活动j是相容的。也就是说, 当si≥fj或sj≥fi时,活动i与活动j相容。
3
9. 数值分析算法。如果在比赛中采用高级语言进行编 程的话,那些数值分析中常用的算法比如方程组 求解、矩阵运算、函数积分等算法就需要额外编写库 函数进行调用。 10. 图象处理算法。赛题中有一类问题与图形有关, 即使问题与图形无关,论文中也会需要图片来说明 问题,这些图形如何展示以及如何处理就是需要解决 的问题,通常使用MATLAB 进行处理。
贪心算法并不总能求得问题的整体最优解。但对 于活动安排问题,贪心算法greedySelector却总能求 得的整体最优解,即它最终所确定的相容活动集合A 的规模最大。这个结论可以用数学归纳法证明。
13
背包问题
给定n种物品和一个背包。物品i的重量是Wi, 其价值为Vi,背包的容量为C。应如何选择装 入背包的物品,使得装入背包中物品的总价值 最大?(假定物品可以分割成更小部分,亦即 物品可以部分装入)
具体算法可描述如下页:
17
float knapsack(float c,float w[], float v[],float x[]) { int n=v.length; for (int i = 0; i < n; i++) d[i] = (w[i],v[i],i); MergeSort.mergeSort(d); int i; float opt=0; for (i=0;i<n;i++) x[i]=0; for (i=0;i<n;i++) { if (d[i].w>c) break; x[d[i].i]=1; opt+=d[i].v; c-=d[i].w; } if (i<n){ x[d[i].i]=c/d[i].w; opt+=x[d[i].i]*d[i].v; } return opt; }

贪心算法

贪心算法
2009 信息学夏令营 倪震祥
1.贪心概念 贪心概念
第二种解决此类问题的方法是动态规划,当然, 第二种解决此类问题的方法是动态规划,当然,使用 动态规划必须要满足一些条件,如无后效性等。 动态规划必须要满足一些条件,如无后效性等。 贪心法是求解这类问题的另一种常用算法, 贪心法是求解这类问题的另一种常用算法,它是从问 题的某一个初始解出发,采用逐步构造最优解 逐步构造最优解的方法向 题的某一个初始解出发,采用逐步构造最优解的方法向 给定的目标前进。在每个局部阶段, 给定的目标前进。在每个局部阶段,都做出一个看上去 最优的决策(即某种意义下的、或某个标准下的局部最 最优的决策(即某种意义下的、或某个标准下的局部最 优解), ),并期望通过每次所做的局部最优选择产生出一 优解),并期望通过每次所做的局部最优选择产生出一 个全局最优解。所以, 个全局最优解。所以,有些问题用贪心法求解能得到最 优解,并且能够证明,而有些却不能证明( 优解,并且能够证明,而有些却不能证明(只能说暂时 找不出反例),甚至并不能保证得到最优解, ),甚至并不能保证得到最优解 找不出反例),甚至并不能保证得到最优解,这时我们 可以选择其它解决最优化问题的算法, 可以选择其它解决最优化问题的算法,如动态规划等。
2009 信息学夏令营 倪震祥
2.贪心策略的特点 贪心策略的特点
贪心算法不是对所有问题都能得到整体最优解, 贪心算法不是对所有问题都能得到整体最优解, 但对范围相当广泛的许多问题它能产生整体最优解 或者是整体最优解的近似解。 或者是整体最优解的近似解。
采用贪心算法的基本思路如下: 采用贪心算法的基本思路如下: 建立数学模型来描述问题。 (1)建立数学模型来描述问题。 把求解的问题分成若干个子问题。 (2)把求解的问题分成若干个子问题。 对每一子问题求解,得到子问题的局部最优解。 (3)对每一子问题求解,得到子问题的局部最优解。 把子问题的解局部最优解合成原求解问题的一个解。 (4)把子问题的解局部最优解合成原求解问题的一个解。

贪心算法

贪心算法

有人说贪心算法是最简单的算法,原因很简单:你我其实都很贪,根本不用学就知道怎么贪。

有人说贪心算法是最复杂的算法,原因也很简单:这世上会贪的人太多了,那轮到你我的份?贪心算法详解贪心算法思想:顾名思义,贪心算法总是作出在当前看来最好的选择。

也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。

当然,希望贪心算法得到的最终结果也是整体最优的。

虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。

如单源最短路经问题,最小生成树问题等。

在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似。

贪心算法的基本要素:1.贪心选择性质。

所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。

这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。

动态规划算法通常以自底向上的方式解各子问题,而贪心算法则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题。

对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。

2. 当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。

问题的最优子结构性质是该问题可用动态规划算法或贪心算法求解的关键特征。

贪心算法的基本思路:从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。

当达到算法中的某一步不能再继续前进时,算法停止。

该算法存在问题:1. 不能保证求得的最后解是最佳的;2. 不能用来求最大或最小解问题;3. 只能求满足某些约束条件的可行解的范围。

实现该算法的过程:从问题的某一初始解出发;while 能朝给定总目标前进一步do求出可行解的一个解元素;由所有解元素组合成问题的一个可行解;用背包问题来介绍贪心算法:背包问题:有一个背包,背包容量是M=150。

贪心算法讲义(李德)

贪心算法讲义(李德)
24
迭代的贪心算法
GreedyActivitySelector ( S , f ){/ / f 单调增有序 n length[ s ]; A {a1}; / / A为解集合 i 1; / / i是最近加入解集合A的活动ai的下标 for m 2 to n do / /找S i , n 1中最早完成的活动am if ( f i sm )then{/ / i m, am与ai 相容 A A {am }; / / am是与ai 相容且完成时间 //最早的活动 i m; / / i仍记录最近加入A的活动ai的下标 } / /endif return }
5
活动选择问题
例(按完成时间递增序排列)
问题的解:A1={a3,a9,a11}, A2={a1,a4, a8,a11}, A3={a2,a4,a9a11} 最优解: A2和A3
此问题可用迭代方法直接给出贪心算法,但为比较和动 态规划之关系,下面先考虑动态规划解法。 i si fi 1 1 4 2 3 5 3 0 6 4 5 7 5 3 8 6 5 9 7 6 8 8 9 8 10 11 2 12
②选Sm1,n+1中最早完成的活动am2
须将S中与am1冲突的活动删除才能得到S m1,n 1 m2未必为2
③一般形式,当选择ami到解集中之后,需解的子 问题变为Smi,n+1
显然,所选活动是按完成时间单调增有序的 (m1<m2<…<mi<…)
19
贪心选择
当某个ami加入解集合后,我们总是在剩余的活 动中选择第一个不与ami冲突的活动加入解集合 ,该活动是能够最早完成且与ami相容。 这种选择为剩余活动的调度留下了尽可能多的 机会。即:留出尽可能多的时间给剩余的尚未 调度的活动,以使解集合中包含的活动最多。 每次选一个最早完成并与刚加入解集元素相容 的活动
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第8章 贪心算法 8.1简介 8.1.1 例子

例子: 有4种硬币,面值分别为2角5分、一角、五分和一分。现在要求以最少的硬币个数找给顾客6角三分。 通常是:先拿两个2角5分的+1个一角+3个一分 这种找法所拿出的硬币个数最少。这种算法其实就是贪心算法。顾名思义:

该算法总是作出在当前看来最好的选择,并且不从整体上考虑最优

问题,所作出的选择只是在某种意义上的局部最优解。

上面的解法得到的恰好也是最优解。因此,贪心方法的效率往往是很高的。 假如,面值有一角一分、五分和一分,要找给顾客一角五分。如果还是使用上述贪心算法,得到的解是:一个一角一分+4个一分。而最优解是3个5分。 又例如:

求节点1到节点6的最短路径。用贪心法得19,而实际为17。 显然贪心算法不能对所有问题都能得到最优解,但是对很多问题(包括很多著名的问题)都能产生整体最优解。例如,我们今天要讲的图的单元最短路径问题、最小生成树问题。在有些情况下,算法不能得到整体最优解,但是结果确是最优解的很好近似。

8.1.2 贪心选择性质 所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的

1 2 4 3 5 6 1

12 7 3 4 5 13 4 15 选择来达到,即贪心选择来达到。这是贪心算法可行的第一个基本要素.也是贪心算法与动态规划算法的主要区别: 动态规划算法:每步所做出的选样往往依赖于相关子问题的解,因而只有在解出相关子问题后.才能做出选择。 贪心算法:仅在当前状态下做出最好选样,即局部最优选则。然后再去解做出这个选择后产生的相应的子问题。贪心算法所做出的贪心选则可以依赖于以往做过的选则,但决不依赖于将来所做的选样,也不依赖于子问题的解。 动态规划:是自底向上的方法解各子问题; 贪心算法:是自顶向下的方法。每做出一次贪心选择就将所求问题简化为规模更小的子问题.

使用贪心法的难点在于:证明所设计的算法确实能够正确解决所求解的问题。即对于一个具体的问题,必须证明每一步所做出的贪心选择最终导致问题的整体最优解。 首先,考察问题的一个整体最优解,并证明可修改这个最优解,使其以贪心选择开始。做出贪心选择后.原问题简化为规模更小的类似子问题。然后,用数学归纳法证明、通过每一步做贪心选择.最终可得到问题的整体最优解。 其中,证明贪心选择后的问题简化为规模最小的类似子问题的关键在于利用该问题的最优子结构性质。

最优子结构性质: 当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。 贪心算法和动态规划算法都要求问题具有最优子结构性质,这是两类算法的一个共同点。但是都具有最优子结构的问题该选则贪心法还是动态规划算法求解?是否能用动态规划法的也能用贪心算法解?

背包问题: 给定n种物品12{,,,}nuuu和一个背包,物品i的体积为is,价值为iv。已经知道背包的承重量为C。 假设i

x是物体i被装入背包的部分,10ix;要求装满背包且

背包内物体价值最大。

Cxsinii1

maxiniixv1

选择方法:目标函数的值增加最快,而包载容量的消耗较慢的物体装入包中。故优先选择价值体积比最大的物体装入背包。

背包与0-1背包的区别: 结论0-1背包问题能用动态规划法解,但不能用贪心法解。 8.3单源最短路径问题(狄斯奎诺Dijkstra’s算法) 一、问题描述 ),(EVG是一个有向图,每条边上有一个非负整数表示长度值,其中有一个顶点s称为源节点。所谓的单源最短路径问题就是:求解该源节点到所有其它节点的最短路径值。不失去一般性,我们假设},...,3,2,1{nV并且s=1。那么该问题可以使用Dijkstra’s算法来求解,该算法是一种贪心算法,并且能求得最优解。

二、算法思想 开始时,我们将所有的顶点划分为两个集合},..,4,3,2{},1{nYX。所有已

经计算好的顶点存放在X中,Y中表示还没有计算好的。Y中的每个顶点y有一个对应的量][y,该值是从源顶点到y(并且只经由X中的顶点)的最短路径值。 (1) 下面就是选择一个][y最小顶点Yy,并将其移动到X中。

(2) 一旦y被从Y移动到X中,Y中每个和y相邻的顶点w的][w都要更新:表示经由y到w的一条更短的路径被发现了。

对于任意一个顶点 Vv,假如我们使用][v表示源顶点到顶点v的最短路径,最后,我们可以证明上述的贪心法结束后有][][vv。

三、算法DIJKSTRA 输入:含权有向图G=(V,E), V={1,2,…n} 输出:G中顶点1到其他顶点的距离 1. }1{X;}1{VY;0]1[ 2. For y←2 to n If y相邻于1 then ],1[][ylengthy

Else ][v; End if 6. end for 7. for j←1 to n-1

8. 令Yy,找到最小][y

9. X←X∪{y} /*将y从Y移动到X中 10 Y←Y-{y} For 每条边{y,w}

If w∈Y and ][y+length[y,w]< ][w then

],[][][wylenthyw /*更新 Y中和y相邻顶点的值 14. endfor 15.end for

四、举例说明:

(手工解该题目) 124

3561

12934513415

1

24

3561

12934513415

0

184

1317

123456

213955346431243

513615 算法的详细实现: (1) 有向图用邻接表来表示 如图 (2) 假设每条边是非负的 (3) X和Y集合用两个向量来表示X[1..n] ,Y[1..n]。初始时X[1]=1,Y[1]=0.并且对于2<=i<=n, X[i]=0,Y[i]=1. 因此,执行

}{yXX的操作,就是X[y]=1, }{yYY的操作就是,Y[y]=0。

五、证明 下面来证明,使用该DIJKSTRA方法得到的是最优解,也就是][][yy。

其中,][v表示源顶点到顶点v的最短路径;][y是从源顶点到y(并且只经由X中的顶点)的最短路径值。

证明: 归纳法 (1) 显然0]1[]1[

(2) 假设,当前将y移动到X中,并且在y之前移动到X中的任何一个顶点c,都有][][cc。由于][y是有限的,也就是说必定存在一条从1到y路径,长度为][y(我们需要来证明][][yy)。 那么这条路径总可以写作: :1→[ ]→[ ]→。。。→[ ]→[ ]→[ ]→y

在上述序列中,我们总是可以找到一个顶点,不妨称之为x(xX),使得x之后的顶点均属于Y,并且x是在y前最迟离开Y的顶点。所以有以下两种情形: 1→[ ]→[ ]→。。。→[ ]→[x ]→y (A) 或是 1→[ ]→[ ]→。。。→[x ]→[ ]…→y (B) √对于情形(A),

[][][,]yxlengthxy 算法要求

[](,)xlengthxy 归纳假设 []y (A)是最短路径 √对于情形(B), 我们将x之后的顶点不妨称之为w,即: 1→[ ]→[ ]→。。。→[x ]→[ w]…→y (B) 于是有:

][][wy 由于y在w之前离开Y

),(][wxlengthx 算法要求

),(][wxlengthx 归纳假设

][w 因为是最短路径 ][y因为是最短路径 我们已经说了,][y是最短路径了,因此][][yy。

六、算法分析 O(n2) 或 O(mn)

8.2.1 稠图的线性时间算法

把算法的复杂度从O(n2)降到O(m logn). 基本思想是用最小堆数据结构来保持集合Y中的顶点,使Y组中离V-Y最近的顶点y可以在O(logn)时间内被选出. 算法8.2 SHORTESTPATH 输入:含权有向图G=(V,E), V={1,2,…n} 输出:G中顶点1到其他顶点的距离.假设已有一个空堆H

1. }1{VY;0]1[;]1[)1(key 2. For y←2 to n If y相邻于1 then ],1[][ylengthy

][)(yykey INSERT(H,y) Else ][v;

][)(yykey End if 6. end for 7. for j←1 to n-1 8. Y←DELETEMIN(H) 10 Y←Y-{y} For 对每个邻接于y的顶点w∈Y

If ][y+length[y,w]< ][w then

],[][][wylenthyw

/*更新 Y中和y相邻顶点的值 ][)(wwkey endif If Hw then INSERT(H,w) ELSE SIFTUP(H,H-1(w))

endif

endfor 15.end for

其中,H-1(w)返回w再H中的位置,可以用一个数组实现。

8.3 最小生成树 设G =(V,E)是无向连通带权图,(V,T)是是G的一个子图,并且T是一颗树,那么称(V,T)是G的生成树。如果T的权之和是所有生成树中最小的,那么则称之为最小生成树。

相关文档
最新文档