最短路问题Dijkstra算法
最短路问题的求解方法

最短路问题的求解方法最短路问题是图论中的一个经典问题,它在很多实际应用中都有着重要的作用。
在现实生活中,我们经常需要求解最短路径,比如在地图导航、网络通信、交通运输等领域。
因此,研究最短路问题的求解方法具有重要的理论意义和实际应用价值。
在图论中,最短路问题的求解方法有很多种,其中比较经典的有Dijkstra算法、Bellman-Ford算法、Floyd-Warshall算法等。
这些算法各有特点,适用于不同的场景和要求。
下面我们就逐一介绍这些算法的原理和求解方法。
Dijkstra算法是一种用于求解单源最短路径的算法,它采用贪心策略,每次找到当前距离最短的节点进行松弛操作,直到所有节点都被遍历。
Dijkstra算法的时间复杂度为O(V^2),其中V为节点的个数。
这种算法适用于边权值为正的图,可以求解从单个源点到其他所有点的最短路径。
Bellman-Ford算法是一种用于求解单源最短路径的算法,它可以处理边权值为负的图,并且可以检测负权回路。
Bellman-Ford算法的时间复杂度为O(VE),其中V为节点的个数,E为边的个数。
这种算法适用于一般情况下的最短路径求解,但是由于其时间复杂度较高,不适用于大规模图的求解。
Floyd-Warshall算法是一种用于求解所有点对最短路径的算法,它可以处理边权值为正或负的图,但是不能检测负权回路。
Floyd-Warshall算法的时间复杂度为O(V^3),其中V为节点的个数。
这种算法适用于求解图中所有点对之间的最短路径,可以同时求解多个源点到多个目标点的最短路径。
除了上述几种经典的最短路求解算法外,还有一些其他的方法,比如A算法、SPFA算法等。
这些算法在不同的场景和要求下有着各自的优势和局限性,需要根据具体情况进行选择和应用。
在实际应用中,最短路问题的求解方法需要根据具体的场景和要求进行选择,需要综合考虑图的规模、边权值的情况、时间效率等因素。
同时,对于大规模图的求解,还需要考虑算法的优化和并行化问题,以提高求解效率。
Dijkstra算法(最短路)

Dijkstra算法(最短路)//某某某某Dijktra(最短路)算法某某某某某某某//#include<ioream>//预编译命令#include<limit>//定义了INT_MA某uingnamepacetd;untintSIZE;//图中顶点总数//Functionname:Dijktra//Decription:计算有向图中起点到终点的最短距离//Returntype:int,最短路的长度//Argument:intEdge[SIZE][SIZE],输入参数,图信息//Argument:intnStart,输入参数,起点//Argument:intDet,输入参数,终点//Argument:intPath[SIZE],返回参数,路径信息intDijktra(intEdge[SIZE][SIZE],intnStart,intDet,intPath[SIZE ]){intMinDi[SIZE];//起点到个点最短路径长度boolInS2[SIZE];//标志各点是否在S2中//初始化inti;for(i=0;i<SIZE;i++)InS2[i]=true;InS2[nStart]=fale;//初始状态只有nStart在S1中,其余在S2中for(i=0;i<SIZE;i++){MinDi[i]=Edge[nStart][i];//初始各点的最大距离if(Edge[nStart][i]<INT_MA某)Path[i]=nStart;//最短路径的前一点elePath[i]=-1;//表示前一点不存在}//进行计算while(InS2[nDet])//当nDet还在S2内则计算{//查找S2中最短路径长度最小值的点intnMinLen=INT_MA某;//最短路径长度的最小值intnPoint=-1;//拥有最小值的点for(i=0;i<SIZE;i++)//查找if((InS2[i])&&(MinDi[i]<nMinLen)){nMinLen=MinDi[i];nPoint=i;}If(nMinLen==INT_MA某)//S2中的点不能从起点走到break;//更新S2和MinDiInS2[nPoint]=fale;//该点从S2移入S1for(i=0;i<SIZE;i++)if((InS2[i])&&(Edge[nPoint][i]<INT_MA某))//对于在S2中的带您与该点有边相连{intnNewLen=nMinLen+Edge[nPoint][i];if(nNewLen<MinDi[i])//如果原路径长{Path[i]=nPoint;//更新路径MinDi[i]=nNewLen;//更新路径长度}}ReturnMinDi[nDet];}//Functionname:OutputPath//Decription:输出路径信息//Returntype:void//Argument:intPath[SIZE],路径信息//Argument:intnDet,终点voidOutputPath(intPath[SIZE],intnDet){if(Path[nDet]==-1)cout<<”没有从起点到v”<<nDet<<”的路径”<<endl; eleif(Path[nDet]==nDet)//是起点cout<<’v’<<nDet;ele{OutputPath(Path,Path[nDet]);//输出前面的路径c out<<”——>v”<<nDet;//输出这一段边}intmain()//主函数{intEdge[SIZE][SIZE];inti,j;//图信息//构造图信息2for(i=0;i<SIZE;i++){for(j=0;j<SIZE;j++)Edge[i][j]=INT_MA某;Edge[i][j]=0;}Edge[0][1]=10;Edge[0][2]=12;Edge[1][3]=10;Edge[2][4]=7;Edge[3][0]=15;Edge[3][1]=12;Edge[3][4]=7;intPath[SIZE];//记录最短路径信息intnPathLength=Dijktra(Edge,0,4,Path)//计算v0到v4的最短路径长度if(nPathLength==INT_MA某)cout<<”从v0到v4没有路径可通”<<endl;ele{cout<<”从v0到v4的路径为:”<<endl;OutputPath(Path,4);//输出v0到v4的最大路径cout<<endl;cout<<”路径长度为:”<<nPathLength<<endl;//输出路径长度}return0;}3。
最短路问题案例(short-path problem)

三、Dijkstra算法演示:
5.选取顶点
U=V\S={A(22), B (13)}
l(B)=13, l(B)=l(C)+W(C,B)
6.选取顶点
U=V\S={A(22)}
l(A)=22, l(A)=l(F)+W(F,A)
三、Dijkstra算法演示:
1. 初始时, S只包含起点s ; U包含除s外的其他顶 点,且U中顶点的距离为“起点s到该顶点的距离”[例. U中顶点v的距离为d(s,v),然而s与v不相邻,故为inf]。
2. 从U中选出“距离最短的顶点w”,并将顶点w 加入到S 中;同时,从U中移除顶点w 。
3. 更新U中各个顶点到起点s的距离。 由于上一步中 确定了w是求出最短路径的顶点,从而可以利用w来更新 其他顶点的距离。[例. (s,v)的距离大于(s,w) + (w,v)]。
l(E)=4, l(E)<l(C)+W(C,E); l(F)=9, l(F)=l(C)+W(C,F)
三、Dijkstra算法演示:
3.选取顶点 U=V\S={A(inf), B (13), F(6), G (12)}
l( )=6, l(F)=l(E)+W(E,F)
4.选取顶点 U=V\S={A(22), B (13), G(12)}
4. 重复步骤2和3,直到遍历完所有顶点。
三、Dijkstra算法演示:
1.选取顶点 U=V\S={A(inf), B (inf), C (3), E (4), F (inf), G (inf)}
2.选取顶点 U=V\S={A(inf), B (13), E (4), F (9), G (inf)}
最短路问题(整理版)

最短路问题(short-path problem)若网络中的每条边都有一个权值值(长度、成本、时间等),则找出两节点(通常是源节点与结束点)之间总权和最小的路径就是最短路问题。
最短路问题是网络理论解决的典型问题之一,可用来解决管路铺设、线路安装、厂区布局和设备更新等实际问题。
最短路问题,我们通常归属为三类:单源最短路径问题(确定起点或确定终点的最短路径问题)、确定起点终点的最短路径问题(两节点之间的最短路径)1、Dijkstra算法:用邻接矩阵a表示带权有向图,d为从v0出发到图上其余各顶点可能达到的最短路径长度值,以v0为起点做一次dijkstra,便可以求出从结点v0到其他结点的最短路径长度代码:procedure dijkstra(v0:longint);//v0为起点做一次dijkstrabegin//a数组是邻接矩阵,a[i,j]表示i到j的距离,无边就为maxlongintfor i:=1 to n do d[i]:=a[v0,i];//初始化d数组(用于记录从v0到结点i的最短路径), fillchar(visit,sizeof(visit),false);//每个结点都未被连接到路径里visit[v0]:=true;//已经连接v0结点for i:=1 to n-1 do//剩下n-1个节点未加入路径里;beginmin:=maxlongint;//初始化minfor j:=1 to n do//找从v0开始到目前为止,哪个结点作为下一个连接起点(*可优化) if (not visit[j]) and (min>d[j]) then//结点k要未被连接进去且最小begin min:=d[j];k:=j;end;visit[k]:=true;//连接进去for j:=1 to n do//刷新数组d,通过k来更新到达未连接进去的节点最小值,if (not visit[j]) and (d[j]>d[k]+a[k,j]) then d[j]:=a[k,j]+d[k];end;writeln(d[n]);//结点v0到结点n的最短路。
什么是Dijkstra算法?

什么是Dijkstra算法?
Dijkstra算法是一种用于解决最短路径问题的算法。
最短路径问题是指在一个加权图中,找到从一个起点到一个终点的最短路径。
Dijkstra算法的基本思想是从起点开始,依次计算到各个节点的最短路径,并将这些节点分为两个集合:已确定最短路径的节点集合和未确定最短路径的节点集合。
在每一次迭代中,从未确定最短路径的节点集合中选取距离起点最近的节点,并将该节点加入已确定最短路径的节点集合中。
然后,更新与该节点相邻的节点的距离,如果更新后的距离比原来的距离小,则更新该节点的最短路径。
Dijkstra算法的时间复杂度为O(n^2),其中n为图中节点的数量。
如果使用优先队列来实现,则时间复杂度可以降至O(mlogn),其中m为图中边的数量。
总之,Dijkstra算法是一种非常常用的解决最短路径问题的算法,它的思想简单易懂,实现也比较容易。
最短路问题

§ 3最短路问题在实践中常遇到的一类网络问题是最短路问题。
给定一个有向赋权图D=(V,A),对每一个弧a =( ,),相应有权≥0,指定D中的为发点,为终点。
最短路问题就是要在所有到的路中,求出一条总权数最小的路。
这里权数可以是距离,也可以是时间,或者是费用等等。
最短路问题是最重要的优化问题之一,它不仅可以直接应用于解决生产实际的许多问题,如管道铺设、线路安排、厂区布局、设备更新等等,而且经常被作为一个基本工具,用于解决其它优化问题。
3.1 狄克斯拉(Dijkstra)算法最短路问题可以化为线性规划问题求解,也可以用动态规划方法求解,这里介绍一种有效算法—狄克斯拉(Dijkstra)算法,这一算法是1959年首次被提出来的。
该算法适用于每条弧的权数≥0情形。
算法的基本思路:从发点出发,有一个假想的流沿网络一切可能的方向等速前进,遇到新节点后,再继续沿一切可能的方向继续前进,则最先到达终点的流所走过的路径一定是最短的。
为了实现这一想法,对假想流依次到达的点,依次给予p标号,表示到这些点的最短距离。
对于假想流尚未到达的点给予T标号,表示到这些点的最短距离的估计值。
具体作法如下:1°标p()=0,其余点标T()=+∞;2°由刚刚获得p标号的点出发,改善它的相邻点的T标号,即新的T()=min{老的T(),p()+ }若T()= p()+ ωij ,则记k()=(前点标记);3°找出具有最小T标号的点,将其标号改为p标号。
若已获得p标号,则已找到最短路,由k ()反向追踪,就可找出到的最短路径,p()就是到的最短距离。
否则,转2°。
例2 求图下中v1 到v8 的最短路。
解:标p()=0,其余点标将具有最小T标号的点的标号改为p标号:p()=3;目前,点具有最小T标号,将其标号改为p标号: p()=4;目前,点具有最小T标号,将其标号改为p标号: p()=5;目前,点具有最小T标号,将其标号改为p标号: p()=6;目前,点具有最小T标号,将其标号改为p标号:最短路径为:因p()=12,所以→的最短距离为12。
最短路dijkstra算法详解

最短路dijkstra算法详解最短路问题是图论中的一个经典问题,其目标是在给定图中找到从一个起点到其他所有节点的最短路径。
Dijkstra算法是解决最短路问题的一种常用算法,本文将详细介绍Dijkstra算法的原理、实现以及时间复杂度等相关内容。
一、Dijkstra算法的原理Dijkstra算法是一种贪心算法,其基本思想是从起点开始,逐步扩展到其他节点。
具体而言,Dijkstra算法通过维护一个集合S来记录已经找到了最短路径的节点,以及一个数组dist来记录每个节点到起点的距离。
初始时,S集合为空,dist数组中除了起点外所有节点都被初始化为无穷大。
接下来,重复以下步骤直到所有节点都被加入S集合:1. 从dist数组中选择距离起点最近的未加入S集合的节点u;2. 将u加入S集合;3. 更新与u相邻的未加入S集合的节点v的距离:如果从起点出发经过u可以得到更短的路径,则更新v对应位置上dist数组中存储的值。
重复以上步骤直至所有节点都被加入S集合,并且dist数组中存储了每个节点到起点的最短距离。
最后,根据dist数组中存储的信息可以得到起点到任意节点的最短路径。
二、Dijkstra算法的实现在实现Dijkstra算法时,需要使用一个优先队列来维护未加入S集合的节点,并且每次从队列中选择距离起点最近的节点。
由于C++标准库中没有提供优先队列,因此需要手动实现或者使用第三方库。
以下是一个基于STL堆实现的Dijkstra算法代码示例:```c++#include <iostream>#include <vector>#include <queue>using namespace std;const int INF = 0x3f3f3f3f;vector<pair<int, int>> adj[10001];int dist[10001];void dijkstra(int start) {priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;pq.push(make_pair(0, start));dist[start] = 0;while (!pq.empty()) {int u = pq.top().second;pq.pop();for (auto v : adj[u]) {if (dist[u] + v.second < dist[v.first]) {dist[v.first] = dist[u] + v.second;pq.push(make_pair(dist[v.first], v.first));}}}}int main() {int n, m, start;cin >> n >> m >> start;for (int i = 1; i <= n; i++) {dist[i] = INF;}for (int i = 1; i <= m; i++) {int u, v, w;cin >> u >> v >> w;adj[u].push_back(make_pair(v, w));}dijkstra(start);for (int i = 1; i <= n; i++) {if (dist[i] == INF) {cout << "INF" << endl;} else {cout << dist[i] << endl;}}return 0;}```以上代码中,adj数组用于存储图的邻接表,dist数组用于存储每个节点到起点的最短距离。
最短路的dijkstra算法基本过程

最短路的dijkstra算法基本过程
最短路的Dijkstra算法基本过程
Dijkstra算法是用来解决最短路径问题的一种算法,它是由荷兰计算机科学家Edsger W. Dijkstra在1959年发明的,是目前最常用的最短路径算法。
它是以贪心策略为基础的,主要是利用局部最优求全局最优。
基本过程如下:
1. 从起点出发,设计出一个距离变量dist[],初始值为无穷大。
2. 将dist[起点]设置为0。
3. 找出当前最近的顶点u,计算出从起点到u的中间点v的最短路径,并更新dist[v]的值,即dist[v] = min(dist[v], dist[u] + w(u,v)),其中w(u,v)表示从u到v的边的权重。
4. 重复步骤3,直到所有的顶点都被处理完为止。
5. 返回dist[],表示从起点到其他所有点的最短路径。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Dijkstra算法基本步骤: 算法基本步骤 算法基本步骤: 迭 代 Step 1: 开始,给vs以 P 标号,P(vs)=0, 开始, 标号, 1 其余各点给 T 标号 T(vi)=+∞. 计算实例:连接 : 的最短路. 求 计算实例求连接 vs、vt 的最短路
- ∞
P T
v1 2
0 -
2
- ∞
一、网络无负权的最短路 ——Dijkstra算法 算法 本算法由Dijkstra于1959年提出,可用于求解指定 于 年提出, 本算法由 年提出 两点间的最短路, 两点间的最短路,或从指定点到其余各点的最短 路,目前被认为是求无负权网络最短路问题的最 好方法。 好方法。 算法的基本思路基于以下原理: 算法的基本思路基于以下原理: 原理 若序列v 的最短路, 若序列 s ,v1 ,…,vn是从 s到vn的最短路, , 是从v 则序列v 则序列 s ,v1 ,…,vn-1必为从 s到vn-1的最短路。 , 必为从v 的最短路。
2 -
v1 2
0 -
2
4 -
7
- 8 9 - 14 ∞
vs 4
5 1 v3
4 -
v2 3 4
5
v4 1
5 7
vt
v5
7 -
迭 Step 3: 比较所有具有 T 标号的点,把最小者改为 标号的点, 代 P 标号, P(vi)=min[T(vi)]. 即 标号, 4
2 -
v1 2
0 -
2
4 -
7
- 8 8 - 14
迭 Step 3: 比较所有具有 T 标号的点,把最小者改为 标号的点, 代 P 标号, P(vi)=min[T(vi)]. 即 标号, 1 当存在两个以上最小者时 可同时改为 标号。若 当存在两个以上最小者时,可同时改为 标号。 可同时改为P 全部点为P标号 则停止。否则用v 代替v 标号,则停止 全部点为 标号 则停止。否则用 i代替 i转step 2.
7
- ∞ - ∞
vs 4
5 1 v3
- ∞
v2 3 4
5
v4 1
5 7
vt
v5
- ∞
标号的点,考虑这样的点 迭 Step 2: 若 vi 为刚得到 P 标号的点 考虑这样的点 vj : (vi ,vj)∈E 且vj 为 T 标号。 标号。 ∈ 代 1 对vj的T 标号进行如下更改 j)=min[T(vj),P(vi)+wij] 标号进行如下更改T(v
10.3 最短路问题
• 最短路问题:在一个赋权图 上,给定两个顶 最短路问题:在一个赋权图G上 点u和 v,在所有连接顶点 和 v 的路中,寻找 和 ,在所有连接顶点u和 的路中, 路长最短的路(称为u和 最短路 最短路.) 路长最短的路(称为 和 v最短路 ) • u和 v最短路的路长也称为 和 v的距离 最短路的路长也称为u和 的距离-d(u,v). 和 最短路的路长也称为 最短路问题是网络理论中应用最广泛的问题之一. 最短路问题是网络理论中应用最广泛的问题之一 许多优化问题可以使用这个模型.如设备更新、 许多优化问题可以使用这个模型.如设备更新、 管道铺设、线路安排、厂区布局等. 管道铺设、线路安排、厂区布局等 我们曾介绍了最短路问题的动态规划解法, 我们曾介绍了最短路问题的动态规划解法,但某 些最短路问题(如道路不能整齐分段者 如道路不能整齐分段者)构造动态规 些最短路问题 如道路不能整齐分段者 构造动态规 划方程比较困准、而图论方法则比较有效。 划方程比较困准、而图论方法则比较有效。 有些最短路问题也可以求网络中某指定点到其余所 有结点的最短路、或求网络中任意两点间的最短路. 有结点的最短路、或求网络中任意两点间的最短路
标号的点,考虑这样的点 迭 Step 2: 若 vi 为刚得到 P 标号的点 考虑这样的点 vj : (vi ,vj)∈E 且vj 为 T 标号。 标号。 ∈ 代 3 对vj的T 标号进行如下更改 j)=min[T(vj),P(vi)+wij] 标号进行如下更改T(v
2 -
v1 2
0 -
2
4 -
7
Dijkstra算法基本思想 算法基本思想 算法 Dijkstra算法的基本思想是从 s出发,逐步地向外 算法的基本思想是从v 出发, 算法的基本思想是从 探寻最短路,采用标号法 标号法。 探寻最短路,采用标号法。 执行过程中,与每个点对应,记录下一个数(称 执行过程中,与每个点对应,记录下一个数( 为这个点的标号),它或者表示从v ),它或者表示从 为这个点的标号),它或者表示从 s到该点的最短 路长(称为P标号),或者是从 标号),或者是从v 路长(称为 标号),或者是从 s到该点的最短路 长的上界(称为T标号 标号)。 长的上界(称为 标号)。 算法每一步都把某个顶点的T 标号改为P 标号, 算法每一步都把某个顶点的 标号改为 标号, 当终点v 标号时,计算结束。最多n-1步 当终点 t 得到 P 标号时,计算结束。最多 步。
2 -
v1 2
0 -
2
4 -
7
8 - 13 13
vs 4
5 1 v3
4 -
v2 3 4
5
v4 1
5 7
vt
v5
7 -
2 -
最短路
2
0 -
v1 2
4 -
7
8 13 -
vs 4
5 1 v3
4 -
v2 3 4
5
v4 1
5 7
vt
v5
7 -
• Dijkstra算法不仅找到了所求最短路,而且找 算法不仅找到了所求最短路, 算法不仅找到了所求最短路 点到其他所有顶点的最短路; 到了从 vs 点到其他所有顶点的最短路;这些最 短路构成了图的一个连通无圈的支撑子图, 短路构成了图的一个连通无圈的支撑子图,即 图的一个支撑树。 图的一个支撑树。
- 2 2 ∞ -
v1
0 -
2 vs 4 v3
- ∞ 4
2
5 - ∞
7
- ∞ - ∞
5 1
v2 3 4
5
v4 1
5 7
vt
v5
- ∞
全部T标号中 最小,令 记录路径(v 全部 标号中,T(v1)最小 令P(v1)=2,记录路径 s ,v1). 标号中 最小 记录路径
标号的点,考虑这样的点 迭 Step 2: 若 vi 为刚得到 P 标号的点 考虑这样的点 vj : (vi ,vj)∈E 且vj 为 T 标号。 标号。 ∈ 代 2 对vj的T 标号进行如下更改 j)=min[T(vj),P(vi)+wij] 标号进行如下更改T(v
2 -
v1 2
0 -
2
4 -
7
8 14 - 13
vs 4
5 1 v3
4 -
v2 3 4
5
v4 1
5 7
vt
v5
7 -
迭 Step 3: 比较所有具有 T 标号的点,把最小者改为 标号的点, 代 P 标号, P(vi)=min[T(vi)]. 即 标号, 5 当存在两个以上最小者时 可同时改为 标号。若 当存在两个以上最小者时,可同时改为 标号。 可同时改为P 全部点为P标号 则停止。否则用v 代替v 标号,则停止 全部点为 标号 则停止。否则用 i代替 i转step 2.
5
v4 1
5 7
vt
v5
7 7 - -
标号的点,考虑这样的点 迭 Step 2: 若 vi 为刚得到 P 标号的点 考虑这样的点 vj : (vi ,vj)∈E 且vj 为 T 标号。 标号。 ∈ 代 4 对vj的T 标号进行如下更改 j)=min[T(vj),P(vi)+wij] 标号进行如下更改T(v
首先, 标号, 解: (1)首先,给vs以 P 标号,P(vs)=0,其余各点给 T 标 首先 其余各点给 号 T(vi)=+∞. (2) 考察 s , T(v1)=min[T(v1),P(vs)+ws1]= min[+∞,0+2]=2 考察v T(v2)=min[T(v2),P(vs)+ws2]= min[+∞,0+5]=5 T(v3)=min[T(v3),P(vs)+ws3]= min[+∞,0+4]=4 (3) 全部 标号中 全部T标号中 标号中,T(v1)最小 令P(v1)=2,记录路径 s ,v1). 最小,令 记录路径(v 最小 记录路径 (4)考察 1 , T(v2)=min[T(v2),P(v1)+w12]= min[5,2+2]=4 考察v 考察 T(v4)=min[T(v4),P(v1)+w14]= min[+∞,2+7]=9 (5) 全部 T 标号中 标号中,T(v2),T(v3)最小 令P(v2)=4, P(v3)=4, 最小,令 最小 记录路径(v 记录路径 1 ,v2), (v1 ,v4),. .…………
Dijkstra算法步骤: 算法步骤 算法步骤: Step 1: 开始,给vs以 P 标号,P(vs)=0, 开始, 标号, 其余各点给 T 标号 T(vi)=+∞. Step 2: 若 vi 为刚得到 P 标号的点 考虑这样的点 标号的点,考虑这样的点 vj : (vi ,vj)∈E 且vj 为 T 标号。 标号。 ∈ 标号进行如下更改T(v 对vj的T 标号进行如下更改 j)=min[T(vj),P(vi)+wij] Step 3: 比较所有具有 T 标号的点,把最小者改为 标号的点, 即 P 标号, P(vi)=min[T(vi)]. 标号, 当存在两个以上最小者时,可同时改为 标号。 可同时改为P 当存在两个以上最小者时 可同时改为 标号。若 全部点为P标号 则停止。否则用v 代替v 标号,则停止 全部点为 标号 则停止。否则用 i代替 i转step 2.