单源最短路径问题
最短路径单源最短路径问题单源最短路径问题

¾ 规律:当按长度增序生成从源s到其它顶点的最短路径时,则当前正 在生成的最短路径上除终点外,其余顶点的最短路径均已生成
¾ 例子:当求0到2的最短路径时,则该路径<0,3,2>上顶点0,3的最短路
径在此前已生成
2
§7.6.1 单源最短路径问题
约定 从源s到终点v的最短路径简称为v的最短路径,SP(v) s到v的最短路径长度简称为v的最短距离,SD(v) 红点集S:最短距离已确定的顶点集合 白点集V-S:最短距离尚未确定的顶点集合
6
1
§7.6.1 单源最短路径问题
例子
10 10
1
0
0 100 100
30 4
∞2
3 30
10 10
1
50
60 2
0 0 100
100 30 4
3 30
10 10
1
50 2
0 0
30
4 90
60
20 3 30
0
10 0
10 1
30
10
4 60
50 2 20 3 30
10 0 1 30 50 10
2 20
100
4 60 3
最短距离:红色 估计距离:白色 依次求出的最短距离为: 1) D[0]=0 2) D[1]=10,调整顶点2 3) D[3]=30,调整顶点2,4 4) D[2]=50,调整顶点4 5) D[4]=60
¾ 最短路径树:各顶点的最短路径(实线)总是一棵以源点为根的树,称之
为最短路径树。
算法思想- Dijkstra(1972图灵奖得主) 基于上述观察 初始化:仅已知源s的最短距离SD(s)=0,故红点集S={s}; 扩充红点集:算法的每一步均是在当前白点集中选一最短距离最小的白点 来扩充红点集,以保证算法是按长度增序来产生各顶点的最短路径; 结束:当前白点集空或仅剩下最短距离为∞的白点为止。注:若s到某白 点的路径不存在,可假设该白点的最短路径是一条长度为∞的虚拟路径。
贪心算法-单源最短路径问题

单源最短路径问题给定一个带权图G=(V,E),其中每条边的权势非负数实数。
另外,还给定V中的一个顶点,成为源。
现在要计算从源到其他所有顶点的最短路径长度(路径长度是指路径上各边的权重之和)。
针对上述问题,写一份详细的算法设计报告。
1.首先证明最优子结构性质:反证法:设P(I,j)为顶点i到j的最短路径,途中经过a,b两点,即p(i,j)={pi,…,pa,pb,…pj}若p(I,j)为最短路径,那么p(a,b)也必定是a,b之间的最短路径,即p(I,j)的最优解一定包含子问题的最优解,若p(a,b)不是最短路径,那么就有p`(a,b)更短,那么p`(I,j)=p(I,a)+p`(a,b)+p(b,j)<p(I,j)与题设p(i,j)为最短路径矛盾,因而得证2.证明贪心选择性质:该题的贪心选择性质即计算dist[i]时每次都选择最短的边设源点为v,源点到顶点u的最短路径为dist[u]设有第三个点x,存在一条边d(v,x)>=dist[x]的,那么d(v,x)+d(x,u)=d(v,u)<dist[u]由于d(x,u)非负,因此由上面两式可推得dist[x]<dist[u],矛盾,即如果每次不选择最短的边将得不到最优解3.算法过程设图G=<V,E>,源顶点为V0,U={V0},dist[i]记录V0到i的最短距离1.选择使dist[i]值最小的顶点i,将i加入到U中2.更新与i直接相邻顶点的dist值。
(dist[j]=min{dist[j],dist[i]+d(I,j)})3.直到V中没有节点停止。
使用一个二维数组储存计算dist,最后一行即源点到各点的最短路径。
单源最短路径问题-Dijkstra

{for(int j=0;j<VEX;j++)
cout<<graph[i][j]<<"\t";
cout<<endl;
}
//输出D、P表头
cout<<" ";
for(i=0;i<VEX;i++)
cout<<"D["<<i<<"] ";
cout<<" ";
for(i=0;i<VEX;i++)
if(D[j]!=-1&&D[j]<D[min]&&B[j]==1) min=j;
cout<<"min="<<min<<" ";
//将具有最短特殊路长度的结点min添加到红点集中
R[min]=1; B[min]=0;
//对数组D作必要的修改
for(j=1;j<VEX;j++)
if(graph[min][j]!=-1&&min!=j) //结点min到j间有路
int len = 0;
while( p != startPoint )
{
theway[len] = p;
p = prev[p];
len++;
}
theway[len] = startPoint;
len++;
for( int i = 0 , j = len - 1 ; i < len ; i++ , j-- )
单源最短路径

单源最短路径问题I 用贪心算法求解贪心算法是一种经典的算法,通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题。
一般具有2个重要的性质:贪心选择性质和最优子结构性质。
一、问题描述与分析单源最短路径问题是一个经典问题,给定带权有向图G =(V,E),其中每条边的权是非负实数。
另外,还给定V中的一个顶点,称为源。
现在要计算从源到所有其他各顶点的最短路长度。
这里路的长度是指路上各边权之和。
这个问题通常称为单源最短路径问题。
分析过程:运用Dijkstra算法来解决单源最短路径问题。
具备贪心选择性质具有最优子结构性质计算复杂性二、算法设计(或算法步骤)用贪心算法解单源最短路径问题:1.算法思想:设置顶点集合S并不断地作贪心选择来扩充这个集合。
一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知。
初始时,S中仅含有源。
设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组dist记录当前每个顶点所对应的最短特殊路径长度。
Dijkstra算法每次从V-S中取出具有最短特殊路长度的顶点u,将u添加到S中,同时对数组dist作必要的修改。
一旦S包含了所有V中顶点,dist就记录了从源到所有其他顶点之间的最短路径长度。
2.算法步骤:(1) 用带权的邻接矩阵c来表示带权有向图, c[i][j]表示弧<vi,vj>上的权值. 若<vi, vj>∉V,则置c[i][j]为∞。
设S为已知最短路径的终点的集合,它的初始状态为空集。
从源点v到图上其余各点vi的当前最短路径长度的初值为:dist[i]=c[v][i] vi∈V。
(2) 选择vj, 使得dist[j]=Min{dist[i] | vi∈V-S},vj就是长度最短的最短路径的终点。
令S=SU{j}。
的当前最短路径长度:(3) 修改从v到集合V-S上任一顶点vk如果dist[j]+c[j][k]< dist[k] 则修改dist[K]= dist[j]+c[j][k](4) 重复操作(2),(3)共n-1次.三、算法实现#include <iostream>#include <stdlib.h>using namespace std;#define MAX 1000000 //充当"无穷大"#define LEN sizeof(struct V_sub_S)#define N 5#define NULL 0int s; //输入的源点int D[N]; //记录最短路径int S[N]; //最短距离已确定的顶点集const int G[N][N] = { {0, 10, MAX, 30, 100},{MAX, 0, 50, MAX, MAX},{MAX, MAX, 0, MAX, 10},{MAX, MAX, 20, 0, 60},{MAX, MAX, MAX, MAX, 0} };typedef struct V_sub_S //V-S链表{int num;struct V_sub_S *next;};struct V_sub_S *create(){struct V_sub_S *head, *p1, *p2;int n = 0;head = NULL;p1 = (V_sub_S *)malloc(LEN);p1->num = s;head = p1;for(int i = 0; i < N+1; i ++){if(i != s){++ n;if(n == 1)head = p1;elsep2->next = p1;p2 = p1;p1 = (V_sub_S *)malloc(LEN);p1->num = i;p1->next = NULL;}}free(p1);return head;}struct V_sub_S *DelMin(V_sub_S *head, int i) //删除链表中值为i 的结点{V_sub_S *p1, *p2;p1 = head;while(i != p1->num && p1->next !=NULL){p2 = p1;p1 = p1->next;}p2->next = p1->next;return head;}void Dijkstra(V_sub_S *head, int s){struct V_sub_S *p;int min;S[0] = s;for(int i = 0; i < N; i ++){D[i] = G[s][i];}for(i = 1; i < N; i ++){p = head->next;min = p->num;while(p->next != NULL){if(D[p->num] > D[(p->next)->num])min = (p->next)->num;p = p->next;}S[i] = min;head = DelMin(head, min);p = head->next;while(p != NULL){if(D[p->num] > D[min] + G[min][p->num]){D[p->num] = D[min] + G[min][p->num];}p = p->next;}}}void Print(struct V_sub_S *head){struct V_sub_S *p;p = head->next;while(p != NULL){if(D[p->num] != MAX){cout << "D[" << p->num << "]: " << D[p->num] << endl;p = p->next;}else{cout << "D[" << p->num << "]: " << "∞" << endl;p = p->next;}}}int main(){struct V_sub_S *head;cout << "输入源点s (0到4之间): ";cin >> s;head = create();Dijkstra(head, s);head = create();Print(head);system("pause");return 0;}运行结果:四、算法分析(与改进)对于具有n个顶点和e条边的带权有向图,如果用带权邻接矩阵表示这个图,那么Dijkstra算法的主循环体需要O(n)时间。
最短路径问题及其变形

最短路径问题及其变形
最短路径问题是指给定一个图和起点、终点,求出起点到终点的路径中具有最小权重和的路径的问题。
可以通过一些经典算法来解决,如Dijkstra算法、Bellman-Ford算法和Floyd-Warshall算法。
最短路径问题的变形可以有很多种,下面介绍几个常见的变形:
1. 单源最短路径问题:给定一个图和一个起点,求出起点到图中所有其他节点的最短路径。
这个问题可以通过Dijkstra算法
或Bellman-Ford算法求解。
2. 多源最短路径问题:给定一个图和多个起点,求出每个起点到图中所有其他节点的最短路径。
这个问题可以通过多次运行Dijkstra算法或Floyd-Warshall算法求解。
3. 含有负权边的最短路径问题:给定一个图,其中可能存在负权边,求出起点到终点的最短路径。
如果图中不存在负权回路,可以使用Bellman-Ford算法求解,如果存在负权回路,则无
法找到最短路径。
4. 最长路径问题:与最短路径问题相反,求出起点到终点的路径中具有最大权重和的路径。
可以通过将图中的权重取反来将最长路径问题转化为最短路径问题求解。
5. 限制路径中经过的节点或边数的最短路径问题:给定一个图和一个限制条件,如经过的节点数或经过的边数等,求出满足
限制条件的最短路径。
可以通过修改Dijkstra算法或Floyd-Warshall算法,增加限制条件来求解。
以上仅为最短路径问题的一些常见变形,实际问题可能还有其他的变形。
解决这些变形问题的关键是根据具体情况修改或选择合适的算法,以及定义适当的权重和限制条件。
单源最短路径及其优化

单源最短路径及其优化介绍在图论中,单源最短路径问题是指在一个加权有向图中,找到从一个固定顶点到其他所有顶点的最短路径。
这个问题在实际应用中有很多场景,比如路网规划、网络路由等。
本文将介绍单源最短路径问题的常见算法以及优化策略,包括Dijkstra算法、Bellman-Ford算法和SPFA算法,并比较它们的优缺点。
Dijkstra算法Dijkstra算法是解决单源最短路径问题的经典算法之一。
它采用贪心策略,从起点开始,逐步扩展路径,直到到达目标顶点或者所有顶点都被遍历。
算法步骤1.初始化距离数组dist,将起点到自身的距离设为0,其他顶点的距离设为无穷大。
2.选择一个未访问的顶点u,使得dist[u]最小。
3.标记顶点u为已访问。
4.遍历顶点u的所有邻接顶点v,更新dist[v]的值,如果dist[u]+weight(u,v)<dist[v],则更新dist[v]为dist[u]+weight(u, v)。
5.重复步骤2-4,直到所有顶点都被访问或者找到目标顶点。
优化策略Dijkstra算法的时间复杂度为O(V^2),其中V是顶点的数量。
当图规模较大时,算法的效率会较低。
为了优化Dijkstra算法,可以使用以下策略:1.使用优先队列(最小堆)来存储未访问的顶点,每次选择dist最小的顶点进行扩展。
这样可以将时间复杂度降低到O((V+E)logV),其中E是边的数量。
2.使用稀疏图优化策略,即当图的边数相对于顶点数较少时,可以使用邻接表来表示图,减少空间开销。
Bellman-Ford算法Bellman-Ford算法是解决单源最短路径问题的另一种常见算法。
相比于Dijkstra算法,Bellman-Ford算法可以处理含有负权边的图。
算法步骤1.初始化距离数组dist,将起点到自身的距离设为0,其他顶点的距离设为无穷大。
2.重复V-1次以下步骤:–遍历图的所有边,对每条边(u, v),如果dist[u]+weight(u,v)<dist[v],则更新dist[v]为dist[u]+weight(u, v)。
求解单源最短路径问题的算法
求解单源最短路径问题的算法
求解单源最短路径问题的算法有多种,下面列举了几种常见的算法:
1. Dijkstra算法:通过维护一个距离数组,不断更新起始点到其他节点的最短路径长度。
核心思想是每次选择距离起始点最近的节点,并逐步更新距离数组。
该算法适用于无负权边的情况。
2. Bellman-Ford算法:通过迭代更新距离数组,每次都扫描所有的边,更新路径长度。
该算法适用于存在负权边的情况。
3. Floyd-Warshall算法:通过一个二维矩阵来存储任意两个节点之间的最短路径长度,通过尝试经过不同的中间节点来更新路径长度。
该算法适用于有向图或无向图,且适用于任意权重的情况。
4. A*算法:在Dijkstra算法的基础上引入启发函数,通过启发函数估计从起始点到目标节点的距离,并按照估计值进行优先级队列的排序。
该算法适用于图中存在目标节点的情况。
以上算法适用于不同的情况,具体选择哪个算法要根据问题的特点来决定。
初中最短路径问题7种类型
初中最短路径问题7种类型初中最短路径问题7种类型最短路径问题是离散数学中一个重要的研究领域,其应用广泛,包括交通路线规划、网络优化等。
对于初中学生来说,了解和掌握最短路径问题,有助于培养他们的逻辑思维和解决问题的能力。
下面将介绍初中最短路径问题的七种类型。
1. 单源最短路径问题单源最短路径问题是指在一个给定的加权有向图中,从一个确定的源点出发,求到其他所有顶点的最短路径。
这个问题可以通过使用迪杰斯特拉算法或贝尔曼-福特算法来求解。
通过学习和理解这些算法,学生可以逐步掌握寻找最短路径的基本方法。
2. 多源最短路径问题多源最短路径问题是指在一个给定的加权有向图中,求任意两个顶点之间的最短路径。
这个问题可以通过使用佛洛依德算法来解决。
学生可以通过了解和实践佛洛依德算法,掌握多源最短路径问题的求解方法。
3. 无权图最短路径问题无权图最短路径问题是指在一个无向无权图中,求从一个顶点到其他所有顶点的最短路径。
这个问题可以通过使用广度优先搜索算法来解决。
学生可以通过学习广度优先搜索算法,了解和掌握无权图最短路径问题的解决方法。
4. 具有负权边的最短路径问题具有负权边的最短路径问题是指在一个给定的加权有向图中,存在负权边,求从一个顶点到其他所有顶点的最短路径。
这个问题可以通过使用贝尔曼-福特算法来解决。
学生可以通过了解和实践贝尔曼-福特算法,理解和应用具有负权边的最短路径问题。
5. 具有负权环的最短路径问题具有负权环的最短路径问题是指在一个给定的加权有向图中,存在负权环,求从一个顶点到其他所有顶点的最短路径。
这个问题可以通过使用贝尔曼-福特算法的改进版来解决。
学生可以通过学习和理解贝尔曼-福特算法的改进版,解决具有负权环的最短路径问题。
6. 具有边权和顶点权的最短路径问题具有边权和顶点权的最短路径问题是指在一个给定的加权有向图中,除了边权之外,还考虑了顶点的权重,求从一个顶点到其他所有顶点的最短路径。
这个问题可以通过使用约翰逊算法来解决。
单源最短路径
单源最短路径贪心算法:一、问题描述:单源最短路径描述:给定带权有向图G=(V,E),其中每条边的权是非负实数。
另外,还给定V中的一个顶点,称之为源(origin)。
现在要计算从源到其他各顶点的最短路径的长度。
这里的路径长度指的是到达路径各边权值之和。
Dijkstra算法是解决单源最短路径问题的贪心算法。
Dijkstra算法的基本思想是:设置顶点集合S并不断地做贪心选择来扩充集合。
一个顶点属于集合S当且仅当从源点到该顶点的最短路径长度已知。
贪心扩充就是不断在集合S中添加新的元素(顶点)。
初始时,集合S中仅含有源(origin)一个元素。
设curr是G的某个顶点,把从源到curr 且中间只经过集合S中顶点的路称之为从源到顶点curr的特殊路径,并且使用数组distance 记录当前每个顶点所对应的最短路径的长度。
Dijkstra算法每次从图G中的(V-S)的集合中选取具有最短路径的顶点curr,并将curr加入到集合S中,同时对数组distance进行必要的修改。
一旦S包含了所有的V中元素,distance数组就记录了从源(origin)到其他顶点的最短路径长度。
二、算法思想步骤:Dijkstra算法可描述如下,其中输入带权有向图是G=(V,E),V={1,2,…,n},顶点v是源。
c是一个二维数组,c[i][j]表示边(i,j)的权。
当(i,j)不属于E时,c[i][j]是一个大数。
dist[i]表示当前从源到顶点i的最短特殊路径长度。
在Dijkstra算法中做贪心选择时,实际上是考虑当S 添加u之后,可能出现一条到顶点的新的特殊路,如果这条新特殊路是先经过老的S到达顶点u,然后从u经过一条边直接到达顶点i,则这种路的最短长度是dist[u]+c[u][i]。
如果dist[u]+c[u][i]<dist[i],则需要更新dist[i]的值。
具体步骤如下:1、用带权的邻接矩阵c来表示带权有向图, c[i][j]表示弧<v i,v j>上的权值。
Dijkstra算法求解单源最短路径问题
Dijkstra算法求解单源最短路径问题一、单源最短路径问题描述给定一个带权有向图G=(V,E),其中每条边的权都是非负数。
给定V中的一个顶点,称为源。
计算从源到所有其他定点的最短路径长度。
这里的路径长度就是指各边权之和。
该问题称为单源最短路径问题(Single-Source Shortest Paths)。
二、Dijkstra算法思想将图G中所有的顶点V分成两个顶点集合S和T。
以v为源点已经确定了最短路径的终点并入S集合中,S初始时只含顶点v, T则是尚未确定到源点v最短路径的顶点集合。
然后每次从T集合中选择S集合点中到T路径最短的那个点,并加入到集合S中,并把这个点从集合T删除。
直到T集合为空为止。
三、算法描述(步骤)1、选一顶点v为源点,并视从源点v出发的所有边为到各顶点的最短路径:①记录从源点v到其它各顶点的路径长度数组dist[],开始时,dist是源点v到顶点i的直接边长度,即dist中记录的是邻接阵的第v行。
②设一个用来记录从源点到其它顶点的路径数组path[],path中存放路径上第i个顶点的前驱顶点。
2、在上述的最短路径dist[]中选一条最短的,并将其终点(即<v,k>)k加入到集合s中。
3、调整T中各顶点到源点v的最短路径。
因为当顶点k加入到集合s中后,源点v到T中剩余的其它顶点j就又增加了经过顶点k到达j的路径,这条路径可能要比源点v到j原来的最短的还要短。
调整方法是比较dist[k]+g[k,j]与dist[j],取其中的较小者。
4、再选出一个到源点v路径长度最小的顶点k,从T中删去后加入S中,再回去到第三步,如此重复,直到集合S中的包含图G的所有顶点。
四、算法实现(数据结构)1、算法实现输入:一个大于1的整数n.输出:●一个随机生成的有向图G=(V,E),对于每一条边,有一个非负数字c(u,v)与之相关。
●对于每个顶点v∈V,得到从v0到v的最短路径的长度。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四单源最短路径问题
一、实验目的:
1、理解分支限界法的剪枝搜索策略;
2、掌握分支限界法的算法柜架;
3、掌握分支限界法的算法步骤;
4、通过应用范例学习动态规划算法的设计技巧与策略;
二、实验内容及要求:
1、使用分支限界法解决单源最短路径问题。
2、通过上机实验进行算法实现。
3、保存和打印出程序的运行结果,并结合程序进行分析,上交实验报告。
三、实验原理:
分支限界法的基本思想:
1、分支限界法与回溯法的不同:
1)求解目标:回溯法的求解目标是找出解空间树中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。
2)搜索方式的不同:回溯法以深度优先的方式搜索解空间树,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树。
2、分支限界法基本思想:
分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。
在分支限界法中,每一个活结点只有一次机会成为扩展结点。
活结点一旦成为扩展结点,就一次性产生其所有儿子结点。
在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。
此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。
这个过程一直持续到找到所需的解或活结点表为空时为止。
3、常见的两种分支限界法:
1)队列式(FIFO)分支限界法
按照队列先进先出(FIFO)原则选取下一个节点为扩展节点。
2)优先队列式分支限界法
按照优先队列中规定的优先级选取优先级最高的节点成为当前扩展节点。
四、程序代码
#include<iostream>
using namespace std;
int matrix[100][100]; // 邻接矩阵
bool visited[100]; // 标记数组
int dist[100]; // 源点到顶点i的最短距离
int path[100]; // 记录最短路的路径
int source; // 源点
int vertex_num; // 顶点数
int edge_num; // 边数
int destination; // 终结点
void Dijkstra(int source)
{
memset(visited, 0, sizeof(visited)); // 初始化标记数组
visited[source] = true;
for (int i = 0; i < vertex_num; i++)
{
dist[i] = matrix[source][i];
path[i] = source;
}
int min_cost; // 权值最小
int min_cost_index; // 权值最小的下标
for (int i = 1; i < vertex_num; i++) // 找到源点到另外 vertex_num-1 个点的最短路径{
min_cost = INT_MAX;
for (int j = 0; j < vertex_num; j++)
{
if (visited[j] == false && dist[j] < min_cost) // 找到权值最小
{
min_cost = dist[j];
min_cost_index = j;
}
}
visited[min_cost_index] = true; // 该点已找到,进行标记
for (int j = 0; j < vertex_num; j++) // 更新 dist 数组
{
if (visited[j] == false &&
matrix[min_cost_index][j] != INT_MAX && // 确保两点之间有边
matrix[min_cost_index][j] + min_cost < dist[j])
{
dist[j] = matrix[min_cost_index][j] + min_cost;
path[j] = min_cost_index;
}
}
}
}
int main()
{
cout << "请输入图的顶点数(<100):";
cin >> vertex_num;
cout << "请输入图的边数:";
cin >> edge_num;
for (int i = 0; i < vertex_num; i++)
for (int j = 0; j < vertex_num; j++)
matrix[i][j] = (i != j) ? INT_MAX : 0; // 初始化 matrix 数组cout << "请输入边的信息:\n";
int u, v, w;
for (int i = 0; i < edge_num; i++)
{
cout << "请输入第" << i + 1 << "条边的信息(中间用空格隔开):";
cin >> u >> v >> w;
matrix[u][v] = matrix[v][u] = w;
}
cout << "请输入源点(<" << vertex_num << "):";
cin >> source;
Dijkstra(source);
cout << "请输入终结点(<" << vertex_num << "):";
cin >> destination;
cout << source << "到" << destination << "最短距离是:" << dist[destination] << ",路径是:" << destination;
int t = path[destination];
while (t != source)
{
cout << "<--" << t;
t = path[t];
}
cout << "<--" << source << endl;
return 0;
}
五、结果运行与分析
本例用使迪杰斯特拉算法来求单源最短路径,也即采用优先队列式分支限界法,按照优先队列中规定的优先级选取优先级最高的节点成为当前扩展节点。
选定源节点后,从源节点开始扩展,并将其子节点按路径长度大小依次存于栈中,每次从栈顶弹出节点作为扩展节点,利用限界来剪去相应的节点。
六、心得与体会
通过这次实验,对迪杰斯特拉算法求解单源最短路径问题做了回顾,上学期修数据结构是已经了解,但是时间长了没有练习就基本忘记了,通过这次实验,更加深了对该算法的印象,也对动态规划做了回顾。
本次实验最重要的还是分支限界法,使用限界,可以有效减小工作量,提高效率。