算法设计与分析-分枝限界法
算法分析与设计分支限界法

算法分析与设计分支限界法分支限界法是一种常用的优化算法,它通过剪枝和分支的方式在空间中找到最优解。
在算法设计与分析中,分支限界法在求解组合优化问题和图论问题中有广泛应用。
分支限界法的基本思想是将问题划分为一个个子问题,并对每个子问题进行求解,同时通过剪枝操作减少空间。
算法从一个初始状态开始,通过扩展子节点来生成树。
在每个节点上,先判断该节点是否需要剪枝操作。
如果需要剪枝,则舍弃该节点及其子节点;如果不需要剪枝,则继续扩展该节点为新的可能解。
通过不断扩展和剪枝操作,最终找到最优解。
分支限界法的核心是选择一个合适的策略来确定节点的扩展顺序。
常用的策略包括优先级队列、最小堆、最大堆等。
这些策略可以根据问题的性质和特点来选择,以保证效率。
同时,剪枝操作也是分支限界法中关键的一环。
剪枝操作有多种方式,如上界和下界剪枝、可行剪枝、标杆剪枝等。
通过剪枝操作,可以减少空间,提高算法的效率。
分支限界法的时间复杂度通常是指数级别的,因为每个节点需要根据策略进行扩展,并进行剪枝操作。
然而,通过合理选择策略和剪枝操作,可以显著减少空间,降低时间复杂度。
此外,分支限界法还可以通过并行计算等技术进一步提高效率。
分支限界法在求解组合优化问题中有广泛应用。
组合优化问题是在有限的资源条件下,通过组合和选择来达到最优解的问题。
例如,旅行商问题、背包问题等都是经典的组合优化问题,而分支限界法可以在有限的时间内找到最优解。
在图论问题中,分支限界法也有重要的应用。
例如,最短路径问题、图着色问题等都可以通过分支限界法求解。
总之,分支限界法是一种基于和剪枝的优化算法,通过合理选择策略和剪枝操作,在有限的时间内找到最优解。
该算法在组合优化问题和图论问题中有广泛应用,可以有效提高问题求解的效率。
在实际应用中,可以根据问题性质和特点选择合适的策略和剪枝操作,以达到最佳的求解效果。
第七章 分支限界法_new

dist[1]=∞ ,0 dist[2]=∞,30,14,11 dist[3]=∞ ,6 dist[4]=∞ ,4 prev[1]=0 prev[2]=1, 4 ,3 prev[3]=1 prev[4]=1
4, 1, 4
3, 1, 6
2, 1, 30
3, 1, 6 2, 1, 30 2, 3, 11
E
North China Electric Power University
H 2, 1, 30 2, 1, 30 3, 1, 6
1
6 5
30
2
4 10
1, 0 , 0
4, 1, 4
3
20
4
2, 1, 30 3, 1, 6 3, 1, 6 2, 1, 30 2, 4, 14 2, 3, 11 2, 1, 30 2, 4, 14
2, 4, 14
2, 4, 14 2, 1, 30
2, 4, 14
2, 1, 30
North China Electric Power University
3.布线问题
1.问题描述
印刷电路板将布线区域分成n*m个方格阵列。精确的电路 布线问题要求确定连接方格a的中点到方格b的中点的最短布线 方案。在布线时,电路只能沿直线或直角进行。为了避免线路 相交,已布了线的方格做了封锁标记,其他线路不允许穿过被 封锁的方格。如下图所示,在一个7*7的方格阵列中布线,其 中起始位置a=(3,2),目标位置b=(4,6),阴影方格表示被封锁的 方格。
North China Electric Power University
例:0-1背包问题 n=3,C=20,(p1,p2,p3)=(20,15,25) (w1,w2,w3)=(10,5,15),求X=(x1,x2,x3)使背包价值最大?
算法分析与设计实验五分枝—限界算法

算法分析与设计实验五分枝—限界算法1、实现0/1背包问题的LC分枝—限界算法,要求使用大小固定的元组表示动态状态空间树,与0/1背包问题回溯算法做复杂性比较。
2、实现货郎担问题的分枝—限界算法并与货郎担问题的动态规划算法做复杂性比较比较。
3、实现带有期限的作业排序的分枝—限界算法并与带有期限的作业排序贪心算法做复杂性比较。
(任选一个完成)实验六分枝—限界算法实验目的1.掌握分枝—限界的基本思想方法;2.了解适用于用分枝—限界方法求解的问题类型,并能设计相应动态规划算法;3.掌握分枝—限界算法复杂性分析方法,分析问题复杂性。
预习与实验要求1.预习实验指导书及教材的有关内容,掌握分枝—限界的基本思想;2.严格按照实验内容进行实验,培养良好的算法设计和编程的习惯;3.认真听讲,服从安排,独立思考并完成实验。
实验设备与器材硬件:PC机软件:C++或Java等编程环境实验原理分枝—限界算法类似于回溯法,也是一种在问题的解空间树上搜索问题解的算法。
但两者求解方法有两点不同:第一,回溯法只通过约束条件剪去非可行解,而分枝—限界法不仅通过约束条件,而且通过目标函数的限界来减少无效搜索,也就是剪掉了某些不包含最优解的可行解;第二,在解空间树上,回溯法以深度优先搜索,而分枝—限界法则以广度优先或最小耗费优先的方式搜索。
分枝—限界的搜索策略是,在扩展节点处,首先生成其所有的儿子结点(分支),然后再从当前的活结点表中选择下一个扩展结点。
为了有效地选择下一扩展结点,以加速搜索进程,在每一活结点处,计算一个函数值(限界),并根据这些已计算出的函数值从当前活结点表中选择一个最有利的结点做为扩展,使搜索朝着解空间树上最优解的分支推进,以便尽快找出一个最优解。
分枝—限界法常以广度优先或以最小耗费优先的方式搜索问题的解空间树(问题的解空间树是表示问题皆空间的一颗有序树,常见的有子集树和排序树)。
在搜索问题的解空间树时,分枝—限界法的每一个活结点只有一次机会成为扩展结点。
第九章 分支限界法

1 8 4
7 6 5
右 2+4=6 左 2+2=4
7 6 5 8 3
2 1 4 7 6 5
2 8 3 2+4=6
7 1 4 6 5
2 6 3 4 4+0=4 5
2 3 1 8 4 7 6 5
2 3 1 8 4 7 6 5
下 3+1=4 1 2 8 7 6 3 4 5
右
1 8 7
9.2 求最优解的分枝限界法
子树X上具有最小搜索代价的答案结点的代价
9.1 一般方法
一个答案结点X的搜索代价cost(X)定义为:从根结点开始,直到搜索 到X为止所耗费的搜索时间.
(2)相对代价函数g(.)
衡量一个结点X的相对代价一般有两种标准: (1),在生成一个答案结点之前,子树X上需要生成的结点数目 (2),在子树X上,离X最近的答案结点到X的路径长度 假设T2中有三个答案结点,A,B,C 采用标准(1), g(X)=4,g(Y)=3,g(Z)=2先找到答 案结点C 采用标准(2), g(X)=1,g(Y)=g(Z)=2先找到答案 结点A
c( X ) U
) U
则X子树可剪去.在搜索到一个答案结
的子树X都可以剪去.
U U
注意:在搜索到一个答案结点之前以 c ( X )
作为剪枝条件,会 作为剪枝条件,又
将最小答案结点误剪除掉,为了既能运用 c ( X ) 作为该子树的最小代价上界值, ε是一个小量
不至于误剪去包含最小答案结点的子树,可对所有结点X,使用u(X)+ε
9.4 0/1背包
9.4.1问题描述
形式化描述: 给定C>0, wi>0,pi>0,要求X=(x0,x1…xn-1) 使得
算法设计与分析(第6章 分支限界法)

11
2014-8-27
西安邮电学院
12
2014-8-27
西安邮电学院
13
2014-8-27
西安邮电学院
14
2014-8-27
西安邮电学院
15
2014-8-27
西安邮电学院
16
2014-8-27
西安邮电学院
17
2014-8-27
西安邮电学院
18
2014-8-27
西安邮电学院Leabharlann 192014-8-27
两种方法的搜索方式比较:
回溯法:深度优先
分支限界法:广度优先或最小费用优先
2014-8-27
西安邮电学院
2
分支限界法的搜索策略:
在扩展节点处,先生成其所有的儿子节点(分支的过 程),在从当前的活节点表中选择下一个扩展节点。为了有 效选择下一个扩展节点,以加速搜索进程,在每一个活节点 处,计算一个函数值(限界的过程),并根据这些已计算出 的函数值,从当前活节点表中选择一个最有利的活节点作为 扩展节点,使得搜索向解空间树上有最优解的分支进行,以 尽快找出一个最优解。
第六章 分支限界法 Branch and Bound
2014-8-27
西安邮电学院
1
分支限界法也是一种在问题解空间上进行尝试搜索算法。 它类似于回溯法,但分支限界法和回溯法的求解目标不同。 回溯法的求解目标是找出满足约束条件的所有解,而分支限 界法的求解目标则是找出满足约束条件的一个解,或者是在 满足约束条件的解中找出使得某一目标函数值达到某种意义 下的最优解。
优先队列: (1)最大优先队列:数值大则优先级高 实现方式:最大堆 (2)最小优先队列:数值小则优先级高 实现方式:最小堆
算法设计与分析 分支限界

…
13
纲要
一、分支限界的基本思想
二、背包问题
三、P和NP
14
问题定义
0-1背包问题
给定n个物品,商品i有两个属性i 和i ,分别代表重量和价格,
背包所承受的物品重量为W
0-1背包问题的目的是要选择一个物品的子集,使其总重量≤W,而价值最大。
解空间
假设解可以有向量( , ,…, )表示, ∈{0,1}, =1表示物品i被放进
(成为死节点),把剩下来的节点加到活节点的表中,然后,从这个
表中选一个节点作为下一个扩展节点。
7
分支限界法
从活节点的表中选一个节点并扩展它。这个扩展操作持续到找到解或这
个表为空为止。
选择下一个扩展节点的方法∶
1)先进先出(FIFO)
这个方法是按节点放进表中的次序从活节点表中选择节点。这个活节点
表可被看作一个队列。使用广度优先来搜索这个棵树。
在这个节点上我们得到的下界大于或等于上界,那么就没有必要在扩
展这个节点既不需在延伸这个分支。
·对于最大化问题规则正好相反:一旦上界小于或等于先前确定的下界,
那么就剪掉这个枝。
4
分支限界法
·首先,分支限界是对最优化问题可行解进行剪枝的一个方法。
·将搜索集中在有希望得到解的分支上。也就是说,在基于上下界和可
时,活节点表可用一个最大堆来表示。下一个扩展节点为最大收益的节点。
9
解空间树
扩展节点
死节点
活节点
success
10
分支限界法
使用分支限界法至少需要注意以下几点:
1.怎么样计算上界,极大值问题;
算法设计与分析复习题目及答案 (3)

分治法1、二分搜索算法是利用(分治策略)实现的算法。
9. 实现循环赛日程表利用的算法是(分治策略)27、Strassen矩阵乘法是利用(分治策略)实现的算法。
34.实现合并排序利用的算法是(分治策略)。
实现大整数的乘法是利用的算法(分治策略)。
17.实现棋盘覆盖算法利用的算法是(分治法)。
29、使用分治法求解不需要满足的条件是(子问题必须是一样的)。
不可以使用分治法求解的是(0/1背包问题)。
动态规划下列不是动态规划算法基本步骤的是(构造最优解)下列是动态规划算法基本要素的是(子问题重叠性质)。
下列算法中通常以自底向上的方式求解最优解的是(动态规划法)备忘录方法是那种算法的变形。
(动态规划法)最长公共子序列算法利用的算法是(动态规划法)。
矩阵连乘问题的算法可由(动态规划算法B)设计实现。
实现最大子段和利用的算法是(动态规划法)。
贪心算法能解决的问题:单源最短路径问题,最小花费生成树问题,背包问题,活动安排问题,不能解决的问题:N皇后问题,0/1背包问题是贪心算法的基本要素的是(贪心选择性质和最优子结构性质)。
回溯法回溯法解旅行售货员问题时的解空间树是(排列树)。
剪枝函数是回溯法中为避免无效搜索采取的策略回溯法的效率不依赖于下列哪些因素(确定解空间的时间)分支限界法最大效益优先是(分支界限法)的一搜索方式。
分支限界法解最大团问题时,活结点表的组织形式是(最大堆)。
分支限界法解旅行售货员问题时,活结点表的组织形式是(最小堆)优先队列式分支限界法选取扩展结点的原则是(结点的优先级)在对问题的解空间树进行搜索的方法中,一个活结点最多有一次机会成为活结点的是( 分支限界法).从活结点表中选择下一个扩展结点的不同方式将导致不同的分支限界法,以下除( 栈式分支限界法)之外都是最常见的方式.(1)队列式(FIFO)分支限界法:按照队列先进先出(FIFO)原则选取下一个节点为扩展节点。
(2)优先队列式分支限界法:按照优先队列中规定的优先级选取优先级最高的节点成为当前扩展节点。
计算机算法的设计与分析

计算机算法的设计与分析计算机算法的设计和分析随着计算机技术的不断发展,算法成为了关键的核心技术之一。
算法的设计和分析是指通过一系列的步骤和方法来解决计算机问题的过程。
本文将详细介绍计算机算法的设计和分析。
一、算法设计的步骤:1. 理解和定义问题:首先需要明确所要解决的问题,并对其进行深入的理解,确定问题的输入和输出。
2. 分析问题:对问题进行分析,确定问题的规模、特点和约束条件,以及可能存在的问题解决思路和方法。
3. 设计算法:根据问题的性质和特点,选择合适的算法设计方法,从而得到解决问题的具体算法。
常见的算法设计方法包括贪心算法、分治算法、动态规划算法等。
4. 实现算法:将步骤3中设计的算法转化为计算机程序,并确保程序的正确性和可靠性。
5. 调试和测试算法:对实现的算法进行调试和测试,包括样本测试、边界测试、异常输入测试等,以验证算法的正确性和效率。
二、算法分析的步骤:1. 理解算法的效率:算法的效率是指算法解决问题所需的时间和空间资源。
理解算法的时间复杂度和空间复杂度是进行算法分析的基础。
2. 计算时间复杂度:时间复杂度用来表示算法解决问题所需的时间量级。
常用的时间复杂度包括常数时间O(1)、对数时间O(logn)、线性时间O(n)、平方时间O(n^2)等。
3. 计算空间复杂度:空间复杂度用来表示算法解决问题所需的空间资源量级。
常用的空间复杂度包括常数空间O(1)、线性空间O(n)、指数空间O(2^n)等。
4. 分析算法的最坏情况和平均情况:算法的最坏情况时间复杂度和平均情况时间复杂度是进行算法分析的关键指标。
最坏情况时间复杂度表示在最不利条件下算法所需的时间量级,平均情况时间复杂度表示在一般情况下算法所需的时间量级。
5. 比较算法的优劣:通过对不同算法的时间复杂度和空间复杂度进行分析,可以对算法的优劣进行比较,从而选择合适的算法。
三、常见的算法设计与分析方法:1. 贪心算法:贪心算法通过每一步的选择来寻求最优解,并且这些选择并不依赖于其他选择。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用方形结点表示。
图7-4 可变大小元组状态空间树
7.4 图问题中的分枝限界算法 7.4.1 TSP问题 7.4.2单源点最短路径问题
搜索过程?
设n个物品的重量存储在数组w[n]中,价值存储在数组v[n]中, 背包容量为W,分枝限界法求解0/1背包问题算法用伪代码描述如下。
算法7.1:分枝限界法求解0/1背包问题 输入:n个物品的重量w[n],价值v[n],背包容量W 输出:背包获得的最大价值和装入背包的物品 1. 根据限界函数计算目标函数的上界up;采用贪心法得到下界down; 2. 计算根结点的目标函数值并加入待处理结点表PT; 3. 循环直到某个叶子结点的目标函数值在表PT中取极大值
问题描述:设有n个作业和一台处理机,每个作业所需的处理 时间、要求的时限和收益可用三元组(ti, di, pi),0≤i<n表示, 其中,作业i的所需时间为ti,如果作业i能够在时限di内完成, 将可收益pi,求使得总收益最大的作业子集J。 想法:
Ø确定目标函数上界、下界;
(上界
、下界
)
Ø确定目标函数的计算方法(作业子集J中所有作业所获取的收 益之和 ,使得总收益最大的作业子集是问题的最优解);
基于上下界函数的FIFO分枝限界法FIFOBB函数
do{ for(对结点E的每个孩子){ x=new Node;x->parent=E;//构造E的孩子结点x if(ĉ(X)<U){ //未被限界函数剪枝的子树根x lst.Append(x);//x进队列 if(x是一个答案结点&&cost(x)<U) //x为答案结点时修正U if(u(x)+ < cost(x))U=u(x)+ ; else{U=cost(x);ans=x;} else if(u(x)+ < U) U=u(x)+ ;//x为非答案结点时修正U } } do{ if(lst.isempty()) return ans;//若队列为空,则返回指针ans lst.serve(E);//从队列中取出活结点 }while(ĉ(E)≥U); //ĉ(E)<U时,E成为扩展结点
(1)如果X是答案结点,cost(X)是X所代表的可 行解的目标函数值,u(X)是该子树上最小代价答案结 点代价的上界值,则U=min{cost(X), u(X)+, U};
(2)如果X代表部分向量,则U=min{u(X)+, U}。 于是,算法可以使用ĉ(X)≥U作为剪枝条件尽可能剪除 多余分枝。
U的值是不断修改的,它根据在搜索中获取的越来越 多的关于最小代价的上界信息,使U的值逐渐逼近该最小 代价值,直到找到最小代价的答案结点。
基于上下界函数的分枝限界法的限界方法可描述 如下:
算法要求U的初值大于最优解的代价,并且在搜 索状态空间树的过程中不断修正U的值,对于某个结点 X,U的值可以按下列原则修正:
7.2 求最优解的分枝限界法
分枝限界法的三种形式:FIFO分枝限界法、LIFO分枝限 界法和LC分枝限界法都可用于求解最优化问题。当分枝限界法 用于求最优解时,需要使用上下界函数作为限界函数。
定义7-1 状态空间树上一个结点X的代价函数c(·)定义为: 若X是答案结点,则c(X)为X所代表的可行解的目标函数值;若 X为非可行解结点,则c(X)=;若X代表部分向量,则c(X)是以 X为根的子树上具有最小代价的结点代价。
(2)优先队列式(LC)分枝限界法 在FIFO分枝限界法中,对下一个E结点的选择规则相当死 板,而且在某种意义上是盲目的。这种选择规则对于有可能快 速检索到一个答案结点的结点没有给出任何优先权。对活结点 使用一个“有智力的”排序函数作为优先权来选择下一个E-结 点。
一个答案结点X的搜索代价cost(X)定义为:从根结点开始, 直到搜索到X为止所耗费的搜索时间。下面定义4个相关函数。
图7-6(a)所示是一个带权无向图,(b)是该图的代价矩阵。
(a) 一个无向图
(b) 无向图的代价矩阵
图7-6 无向图及其代价矩阵
1.确定问题的上界16,下界14。 如何设计求上、下界策略?
2.确定限界函数计算方法
一般情况下,假设当前已确定的路径为U=(r1, r2, …, rk), 即路径上已确定了k个顶点,此时,该部分解的目标函数 值的计算方法如下:
}while(1)
7.2.2 LC分枝限界法
与函数FIFOBB相比,函数LCBB采用优先权队列作为 活结点表。两者的区别在于前者只有当活结点表为空时,算 法才结束;后者以优先权队列为空或ĉ(X)≥U为算法终止条件。 ĉ(X)作为结点X的优先权。函数如下:
基于上下界函数的LC分枝限界法LCBB函数
从活结点表中选择下一扩展结点的不同方式导致不同的分
枝限界法。最常见的有以下两种方式。 (1)队列式(FIFO)分枝限界法 队列式分枝限界法将活结点表组织成一个队列,并按队列
的先进先出FIFO原则选取下一个结点为当前扩展结点,对当前 扩展结点的所有儿子进行检测,满足约束条件的儿子,放入活 结点表中,该扩展结点成为死结点,再从活结点表中取出的其 他结点作为新的扩展结点—先广后深。
Ø相对代价估计函数
作为g(X)的估计值,用于估计结点X的相对代价,它是由X到达一个
答案结点所需代价的估计函数。一般地,假定 满足如下特性:如果Y是X的孩子,
则有
。
Ø代价估计函数
是代价估计函数,它由两部分组成:
,其中f(x)是由
根结点到结点X的代价(成本); 是由X到达一个答案结点的代价估计函数
(下界)。一般而言,可令f(X)等于X在树中的层次。
想法: Ø确定目标函数上、下界; Ø确定目标函数的计算方法; 一般情况下,假设当前已对前i个物品进行了某种特定的选 择,且背包中已装入物品的重量是w,获得的价值是v,计算该 结点的目标函数上界的一个简单方法是,将背包中剩余容 量全部装入第i+1个物品,并可以将背包装满,于是,得到限界 函数:
Ø依上计算从根结点到叶子结点的目标函数值直到表PT中 取得极大值。
Ø代价函数c(X)
若X是答案结点,则c(X)是由状态空间树的根结点到X的搜索代价(成本); 若X不是答案结点且子树X上不含任何答案结点,则c(X)=∞;若X不是答案结点但 子树X上包含答案结点,则c(X)等于子树X中具有最小搜索代价(成本)的答案结 点的代价(成本)。
Ø相对代价函数g(.)
衡量一个结点X的相对代价一般有两种标准:①在生成一个答案结点之前,子 树X上需要生成的结点数目;②在子树X上,离X最近的答案结点到X的路径长度。 容易看出,如果采用标准①总是生成最小数目的结点;如果采用标准②,则要成为E -结点的结点只是由根到最近的那个答案结点路径上的那些结点。
Ø基于上、下界,按分枝限界法设计思想,搜索解空间树,得 到最优解。
例:设有带时限的作业排序实例:n=4,(p0, d0, t0)=(5, 1, 1),(p1, d1, t1)=(10, 3, 2),(p2, d2, t2)=(6, 2, 1)和(p3, d3, t3)=(3, 1, 1),求使得总收益最大的作业子集J。
Ø对于任意结点X,若ĉ(X)>U,则X子树可以剪除。
ĉ(X)是X子树上最小代价答案结点的代价,而U是整 个树的最小代价的上界值。
Ø在算法以及搜索到一个答案结点后,所有满足ĉ(X)>U的 子树都可以剪除,但如果在得到答案结点之前则可能会将 最小答案结点误剪除。为了能运用ĉ(X)>=U作为剪枝条件, 又不至于误剪去包含最小代价答案结点的子树,可以对所 有结点X,使用u(X)+ε作为该子树的最小代价上界值,ε是 一个小量。
7.4.1 TSP问题
问题描述:TSP问题是指旅行家要旅行n个城市,要求各 个城市经历且仅经历一次然后回到出发城市,并要求所 走的路程最短。
想法: Ø确定目标函数的界[down, up] 。(提示:如何确定上、 下界?) Ø确定目标函数值的计算方法(限界函数)。 Ø基于上、下界,按分枝限界法设计思想,搜索解空间树, 得到最优解。
本章要点
• 队列式分枝限界法 • 优先队列式分枝限界法 • 0/1背包问题 • 带限期作业排序 • TSP问题 • 单源点最 7.2 求最优解的分枝限界法 7.3 组合问题中的分枝限界算法 7.4 图问题中的分枝限界算法 7.5 典型的c++程序 7.6 小结
7.1 算法思想
定义7-2 函数u(·)和ĉ(·)分别是代价函数c(·)的上界和下界函 数。对所有结点X,总有ĉ(X)≤c(X)≤u(X)。
上下界函数的作用是一种限界作用,也是一种剪枝函数。 在求解最优化问题时,它可以进一步压缩所生成的状态空间树 的结点数目。对于许多问题虽然不能确切求得c(X),但却能得 到ĉ(·)和u(X),使得ĉ(X)≤c(X)≤u(X)。
do{ for(对结点E的每个孩子){ x=new Node;x->parent=E;//构造E的孩子结点x if(ĉ(X)<U){ //x子树未被限界函数剪枝 lst.Append(x); if(x是一个答案结点&&cost(x)<U) //x为答案结点时修正U if(u(x)+ < cost(x))U=u(x)+ ; else{U=cost(x);ans=x;} else if(u(x)+ < U) U=u(x)+ ;//x为非答案结点时修正U } } if(!lst.isempty()){ lst.serve(E);//从队列中取出活结点E if(ĉ(E)≥U) return ans; //若ĉ(E)≥U,则算法结束 } else return ans; //若队列为空,则算法结束