1043 【图论基础】求一个无向图的最短路径(dijkstra) 1044 有向图中任意两点最短路径(floyd)
- 格式:doc
- 大小:38.50 KB
- 文档页数:6
Dijkstra算法是一种用于计算图中从一个顶点到其他所有顶点的最短路径的算法。
它由荷兰计算机科学家艾兹赫尔·戴克斯特拉于1956年提出。
Dijkstra算法的基本思想是通过不断更新起始顶点到其他顶点的最短路径长度,逐步找到最短路径。
以下将详细介绍Dijkstra算法的步骤,并给出一个例题和表格供读者参考。
一、算法步骤1. 初始化- 设置起始顶点的最短路径为0,其余顶点的最短路径为无穷大。
- 将起始顶点加入已访问的顶点集合。
2. 更新- 从未访问的顶点中选择离起始顶点最近的顶点,将其加入已访问的顶点集合。
- 更新起始顶点到其他顶点的最短路径长度,如果经过新加入的顶点到其他顶点的路径长度小于当前已知的最短路径长度,则更新最短路径长度。
3. 重复更新直到所有顶点都被访问过。
二、算法实例为了更好地理解Dijkstra算法的具体应用步骤,我们通过一个实际的例题来演示算法的执行过程。
假设有以下带权重的图,起始顶点为A:顶点 A B C D EA 0 3 4 ∞ ∞B ∞ 0 ∞ 1 7C ∞ 4 0 2 ∞D ∞ ∞ ∞ 0 5E ∞ ∞ ∞ ∞ 0表中每个元素表示从对应顶点到其它顶点的边的权重,"∞"表示没有直接相连的边。
我们按照Dijkstra算法的步骤来计算从顶点A到其他顶点的最短路径长度。
1. 初始化起始顶点为A,初始化A到各顶点的最短路径长度为0,其余顶点的最短路径长度为∞。
将A加入已访问的顶点集合。
2. 更新选择A到B的路径长度最短,将B加入已访问的顶点集合。
更新A到C和A到D的最短路径长度。
3. 重复更新依次选择离起始顶点最近的顶点,并更新最短路径长度,直到所有顶点被访问。
通过不断的更新,最终得到从顶点A到其他顶点的最短路径长度表格如下:顶点 A B C D E最短路径长度 0 3 4 5 9三、总结通过以上Dijkstra算法的步骤和实例计算,我们可以清晰地了解该算法的执行过程和原理。
在交通网络中,常常会提出许多这样的问题:两地之间是否有路相通?在有多条通路的情况下,哪一条最近?哪一条花费最少等。
交通网络可以用带权图表示,图中顶点表示域镇,边表示两城之间的道路,边上权值可表示两城镇间的距离,交通费用或途中所需的时间等。
以上提出的问题就是带权图中求最短路径的问题,即求两个顶点间长度最短的路径。
最短路径问题的提法很多。
在这里仅讨论单源最短路径问题:即已知有向图(带权),我们希望找出从某个源点S∈V到G中其余各顶点的最短路径。
例如:下图(有向图G14),假定以v1为源点,则其它各顶点的最短路径如下表所示:图G14从有向图可看出,顶点v1到v4的路径有3条:(v1,v2,v4),(v1,v4),(v1,v3,v2,v4),其路径长度分别为:15,20和10。
因此v1到v4的最短路径为(v1,v3,v2,v4 )。
为了叙述方便,我们把路径上的开始点称为源点,路径的最后一个顶点为终点。
那么,如何求得给定有向图的单源最短路径呢?迪杰斯特拉(Dijkstra)提出按路径长度递增产生诸顶点的最短路径算法,称之为迪杰斯特拉算法。
迪杰斯特拉算法求最短路径的实现思想是:设有向图G=(V,E),其中,V={0,2,…,n-1},cost是表示G的邻接矩阵,G.arcs [i][j] .adj 表示有向边<i,j>的权。
若不存在有向边<i,j>,则G.arcs [i][j] .adj 的权为无穷大(这里取值为32767)。
设S是一个集合,其中的每个元素表示一个顶点,从源点到这些顶点的最短距离已经求出。
设顶点v0为源点,集合S的初态只包含顶点v0。
数组D记录从源点到其他各顶点当前的最短距离,其初值为D[i]= G.arcs[v0][i].adj ,i=1,…,n-1。
从S之外的顶点集合V-S 中选出一个顶点w,使D[w]的值最小。
于是从源点到达w只通过S 中的顶点,把w加入集合S中调整D中记录的从源点到V-S中每个顶点v的距离:从原来的D[v] 和D[w]+ G.arcs [w][v] .adj中选择较小的值作为新的D[v]。
图论中的最短路径算法图论是数学的一个分支,研究图的性质和图之间的关系。
在图论中,最短路径算法是一类重要的算法,用于寻找图中两个顶点之间的最短路径。
本文将介绍图论中的几种常见的最短路径算法。
一、Dijkstra算法Dijkstra算法是最短路径算法中最常用的一种。
它基于贪心策略,通过逐步扩展路径来求解最短路径。
算法的基本思想是,从一个起始顶点开始,逐步扩展到其他顶点,每次选择当前路径中距离起始顶点最近的顶点进行扩展,直到扩展到目标顶点或者所有顶点都被扩展完毕。
Dijkstra算法的步骤如下:1. 初始化起始顶点的距离为0,其他顶点的距离为无穷大。
2. 选择距离起始顶点最近的顶点,将其加入已扩展顶点集合。
3. 更新与新加入顶点相邻的顶点的距离,如果新的距离比原来的距离小,则更新距离。
4. 重复步骤2和步骤3,直到扩展到目标顶点或者所有顶点都被扩展完毕。
5. 根据更新后的距离,可以得到最短路径。
二、Bellman-Ford算法Bellman-Ford算法是另一种常用的最短路径算法。
它可以处理带有负权边的图,而Dijkstra算法只适用于非负权边的图。
Bellman-Ford算法的基本思想是通过对所有边进行松弛操作,逐步减小起始顶点到其他顶点的估计距离,直到得到最短路径。
Bellman-Ford算法的步骤如下:1. 初始化起始顶点的距离为0,其他顶点的距离为无穷大。
2. 对所有边进行松弛操作,即如果存在一条边(u, v),使得从起始顶点到v的距离大于从起始顶点到u的距离加上边(u, v)的权值,则更新距离。
3. 重复步骤2,直到没有顶点的距离发生变化。
4. 根据更新后的距离,可以得到最短路径。
三、Floyd-Warshall算法Floyd-Warshall算法是一种多源最短路径算法,可以求解图中任意两个顶点之间的最短路径。
该算法通过动态规划的方式,逐步更新顶点之间的距离,直到得到最短路径。
Floyd-Warshall算法的步骤如下:1. 初始化顶点之间的距离矩阵,如果两个顶点之间存在边,则距离为边的权值,否则距离为无穷大。
最短路径问题算法最短路径问题算法概述:在图论中,最短路径问题是指在一个加权有向图或无向图中,从一个顶点出发到另外一个顶点的所有路径中,权值和最小的那条路径。
最短路径问题是图论中的经典问题,在实际应用中有着广泛的应用。
本文将介绍常见的几种最短路径算法及其优缺点。
Dijkstra算法:Dijkstra算法是一种贪心算法,用于解决带权有向图或无向图的单源最短路径问题,即给定一个起点s,求出从s到其他所有顶点的最短路径。
Dijkstra算法采用了广度优先搜索策略,并使用了优先队列来维护当前已知的距离最小的节点。
实现步骤:1. 初始化:将起始节点标记为已访问,并将所有其他节点标记为未访问。
2. 将起始节点加入优先队列,并设置其距离为0。
3. 重复以下步骤直至队列为空:a. 取出当前距离起始节点距离最小的节点u。
b. 遍历u的所有邻居v:i. 如果v未被访问过,则将其标记为已访问,并计算v到起始节点的距离,更新v的距离。
ii. 如果v已被访问过,则比较v到起始节点的距离和当前已知的最短距离,如果更小则更新v的距离。
c. 将所有邻居节点加入优先队列中。
优缺点:Dijkstra算法能够求解任意两点之间的最短路径,并且保证在有向图中不会出现负权回路。
但是Dijkstra算法只适用于无负权边的图,因为负权边会导致算法失效。
Bellman-Ford算法:Bellman-Ford算法是一种动态规划算法,用于解决带权有向图或无向图的单源最短路径问题。
与Dijkstra算法不同,Bellman-Ford算法可以处理带有负权边的图。
实现步骤:1. 初始化:将起始节点标记为已访问,并将所有其他节点标记为未访问。
2. 对于每个节点v,初始化其到起始节点s的距离为正无穷大。
3. 将起始节点s到自身的距离设置为0。
4. 重复以下步骤n-1次(n为顶点数):a. 遍历所有边(u, v),如果u到起始节点s的距离加上(u, v)边权小于v到起始节点s的距离,则更新v的距离为u到起始节点s的距离加上(u, v)边权。
【转】彻底弄懂最短路径问题(图论)P.S.根据个⼈需要,我删改了不少问题引⼊问题:从某顶点出发,沿图的边到达另⼀顶点所经过的路径中,各边上权值之和最⼩的⼀条路径——最短路径。
解决最短路的问题有以下算法,Dijkstra算法,Bellman-Ford算法,Floyd算法和SPFA算法,另外还有著名的启发式搜索算法A*,不过A*准备单独出⼀篇,其中Floyd算法可以求解任意两点间的最短路径的长度。
笔者认为任意⼀个最短路算法都是基于这样⼀个事实:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若⼲个节点到B。
⼀.Dijkstra算法该算法在《数据结构》课本⾥是以贪⼼的形式讲解的,不过在《运筹学》教材⾥被编排在动态规划章节,建议读者两篇都看看。
(1) 迪杰斯特拉(Dijkstra)算法按路径长度递增次序产⽣最短路径。
先把V分成两组:S:已求出最短路径的顶点的集合V-S=T:尚未确定最短路径的顶点集合将T中顶点按最短路径递增的次序加⼊到S中,依据:可以证明V0到T中顶点Vk的最短路径,或是从V0到Vk的直接路径的权值或是从V0经S中顶点到Vk的路径权值之和(反证法可证)。
(2) 求最短路径步骤1. 初使时令 S={V0},T={其余顶点},T中顶点对应的距离值,若存在<V0,Vi>,为<V0,Vi>弧上的权值(和SPFA初始化⽅式不同),若不存在<V0,Vi>,为Inf。
2. 从T中选取⼀个其距离值为最⼩的顶点W(贪⼼体现在此处),加⼊S(注意不是直接从S集合中选取,理解这个对于理解vis数组的作⽤⾄关重要),对T中顶点的距离值进⾏修改:若加进W作中间顶点,从V0到Vi的距离值⽐不加W的路径要短,则修改此距离值(上⾯两个并列for循环,使⽤最⼩点更新)。
3. 重复上述步骤,直到S中包含所有顶点,即S=V为⽌(说明最外层是除起点外的遍历)。
无向图最短路径算法设计在图论中,最短路径算法是解决图中两个顶点之间最短路径问题的关键算法。
无向图是一种由顶点和边组成的数据结构,其中边没有方向。
本文将介绍几种常用的无向图最短路径算法的设计与实现。
一、Dijkstra算法Dijkstra算法是解决单源最短路径问题的一种贪心算法。
它通过逐步确定起点到各个顶点的最短距离,从起点开始,每次选择最短距离的顶点,并更新与该顶点相邻的顶点的最短距离。
直到所有顶点都被访问过,得到起点到各个顶点的最短路径。
该算法的步骤如下:1. 初始化起点到各个顶点的距离为无穷大,起点到自身的距离为0。
2. 选择起点作为当前顶点,标记该顶点已被访问。
3. 更新当前顶点的邻居顶点的最短距离,如果经过当前顶点到达邻居顶点的距离小于邻居顶点当前已有的最短距离,则更新邻居顶点的最短距离。
4. 从未被访问的顶点中选择距离起点最近的顶点作为新的当前顶点,并标记该顶点已被访问。
5. 重复步骤3和步骤4,直到所有顶点都被访问过。
二、Floyd-Warshall算法Floyd-Warshall算法是解决任意两点最短路径问题的一种动态规划算法。
它通过逐步更新所有顶点之间的最短路径长度,得到任意两点之间的最短路径。
该算法的步骤如下:1. 初始化距离矩阵,其中顶点之间的距离已知的用实际距离表示,未知的用无穷大表示。
2. 逐步更新距离矩阵,对于每个顶点k,判断通过顶点k是否可以使得顶点i到顶点j的距离变小,如果可以,则更新距离矩阵中的对应值。
3. 重复步骤2,直到所有顶点之间的最短路径长度都得到更新。
三、Bellman-Ford算法Bellman-Ford算法是解决单源最短路径问题的一种动态规划算法。
它通过逐步更新起点到各个顶点的最短距离,得到起点到其他顶点的最短路径。
该算法的步骤如下:1. 初始化起点到各个顶点的距离为无穷大,起点到自身的距离为0。
2. 逐步更新起点到各个顶点的最短距离,对于每条边(u, v),如果通过边(u, v)的距离小于起点到顶点v的当前最短距离,则更新起点到顶点v的最短距离。
无权图的最短路径算法无权图是指图中的每条边都没有权值,也就是说从一个节点到另一个节点的距离都是相等的。
在无权图中找到最短路径是一个常见的问题,它在许多实际应用中都有重要的作用,比如路线规划、网络通信等。
为了解决无权图的最短路径问题,人们发展了许多算法,下面将介绍两种常用的算法:广度优先搜索(BFS)和Dijkstra算法。
一、广度优先搜索算法(BFS)广度优先搜索算法是一种重要的图遍历算法,它从给定的起始顶点出发,逐层遍历图中的节点,直到找到目标节点或者遍历完所有节点。
具体步骤如下:1.将起始顶点标记为已访问,并将其入队。
2.重复以下步骤直到队列为空:a)将队首元素出队,并记录为当前顶点。
b)遍历当前顶点的所有邻接顶点:-若邻接顶点未被访问,则将其标记为已访问,并将其入队。
3.如果找到目标顶点,则停止遍历,否则继续遍历直到所有节点都被访问。
BFS算法可以保证在无权图中找到的第一个路径就是最短路径,因此它非常适用于解决无权图的最短路径问题。
二、Dijkstra算法Dijkstra算法是一种经典的最短路径算法,它可以在有向图或无向图中找到从一个起点到其他所有顶点的最短路径。
具体步骤如下:1.初始化距离数组dist[],将起始顶点的距离设为0,其余顶点的距离设为无穷大。
2.重复以下步骤直到所有顶点都被访问:a)从未访问的顶点中选择距离起始顶点最近的顶点,并将其标记为已访问。
b)更新起始顶点到所有邻接顶点的距离:-若经过当前顶点到达邻接顶点的距离比已记录的距离更短,则更新距离。
3.遍历完所有顶点后,dist[]数组中存储的就是起始顶点到其他所有顶点的最短距离。
需要注意的是,Dijkstra算法要求图中的边权值都为非负数。
当图中存在负权边时,可以使用其他算法如Bellman-Ford算法进行求解。
结语无权图的最短路径算法是解决许多实际问题的基础,通过广度优先搜索算法和Dijkstra算法,我们可以高效地找到最短路径。
离散数学是数学的一个分支,研究离散对象和不连续对象的数量关系及其结构的数学学科。
离散数学对于计算机科学和信息技术领域有着重要的应用,其中最短路径dijkstra算法是离散数学中的一个重要算法,它被广泛应用于计算机网络、交通规划、电路设计等领域,在实际应用中发挥着重要的作用。
一、最短路径dijkstra算法的基本原理最短路径dijkstra算法是由荷兰计算机科学家艾兹赫尔·达斯提出的,用于解决带权图中的单源最短路径问题。
该算法的基本原理是:从一个源点出发,按照权值递增的顺序依次求出到达其它各个顶点的最短路径。
具体来说,最短路径dijkstra算法的实现步骤如下:1. 初始化:将源点到图中各个顶点的最短路径估计值初始化为无穷大,将源点到自身的最短路径估计值初始化为0;2. 确定最短路径:从源点开始,选择一个离源点距离最近的未加入集合S中的顶点,并确定从源点到该顶点的最短路径;3. 更新距离:对于未加入集合S中的顶点,根据新加入集合S中的顶点对其进行松弛操作,更新源点到其它顶点的最短路径的估计值;4. 重复操作:重复步骤2和步骤3,直到集合S中包含了图中的所有顶点为止。
二、最短路径dijkstra算法的实现最短路径dijkstra算法的实现可以采用多种数据结构和算法,比较常见的包括邻接矩阵和邻接表两种表示方法。
在使用邻接矩阵表示图的情况下,最短路径dijkstra算法的时间复杂度为O(n^2),其中n表示图中顶点的个数;而在使用邻接表表示图的情况下,最短路径dijkstra 算法的时间复杂度为O(nlogn)。
三、最短路径dijkstra算法的应用最短路径dijkstra算法可以应用于计算机网络中路由选择的最短路径计算、交通规划中的最短路径选择、电路设计中的信号传输最短路径计算等领域。
在实际应用中,最短路径dijkstra算法通过寻找起始点到各个顶点的最短路径,为网络通信、交通规划、电路设计等问题提供有效的解决方案。
最短路径dijkstra算法例题最短路径问题是图论中的一个重要问题,它的解决方法有很多种,其中最著名的算法之一就是Dijkstra算法。
本文将介绍Dijkstra算法的基本思想和实现过程,并通过一个例题来展示其具体应用。
一、Dijkstra算法的基本思想Dijkstra算法是一种贪心算法,它以起点为中心向外扩展,每次选择当前距离起点最短的点作为下一个扩展点,并更新其周围节点到起点的距离。
这个过程不断重复直至所有节点都被扩展完毕。
具体实现时,可以使用一个数组dist来存储每个节点到起点的距离,初始时所有节点到起点的距离都设为无穷大(表示不可达),起点到自己的距离设为0。
同时还需要使用一个visited数组来记录每个节点是否已经被扩展过。
在每次扩展时,从未被扩展过且与当前扩展节点相邻的节点中选择距离起点最短的节点作为下一个扩展节点,并更新其周围节点到起点的距离。
这个过程可以使用优先队列来实现。
二、Dijkstra算法实现例题下面我们通过一个例题来演示Dijkstra算法的具体实现过程。
例题描述:给定一个有向带权图,求从起点s到终点t的最短路径。
解题思路:根据Dijkstra算法的基本思想,我们可以使用一个优先队列来实现。
具体实现步骤如下:1. 初始化dist数组和visited数组。
2. 将起点s加入优先队列,并将其距离起点的距离设为0。
3. 重复以下步骤直至优先队列为空:(1)取出优先队列中距离起点最近的节点u。
(2)如果该节点已经被扩展过,则跳过此节点,否则将其标记为已扩展。
(3)如果该节点就是终点t,则返回其到起点的距离。
(4)否则,遍历该节点的所有邻居节点v,并更新它们到起点的距离。
如果某个邻居节点v之前未被扩展过,则将其加入优先队列中。
更新dist[v]后,需要将v加入优先队列中以便后续扩展。
4. 如果经过以上步骤仍然没有找到终点t,则表示不存在从起点s到终点t的路径。
代码实现:```#include <iostream>#include <queue>#include <vector>using namespace std;const int INF = 0x3f3f3f3f;const int MAXN = 1005;int n, m, s, t;int dist[MAXN], visited[MAXN];vector<pair<int, int>> graph[MAXN];void dijkstra() {priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;pq.push(make_pair(0, s));dist[s] = 0;while (!pq.empty()) {pair<int, int> p = pq.top();pq.pop();int u = p.second;if (visited[u]) {continue;}visited[u] = 1;if (u == t) {return;}for (int i = 0; i < graph[u].size(); i++) {int v = graph[u][i].first;int w = graph[u][i].second;if (!visited[v] && dist[v] > dist[u] + w) {dist[v] = dist[u] + w;pq.push(make_pair(dist[v], v));}}}}int main() {cin >> n >> m >> s >> t;for (int i = 1; i <= m; i++) {int u, v, w;cin >> u >> v >> w;graph[u].push_back(make_pair(v, w));}memset(dist, INF, sizeof(dist));memset(visited, 0, sizeof(visited));dijkstra();if (dist[t] == INF) {cout << "No path from " << s << " to " << t << endl;} else {cout << "Shortest path from " << s << " to " << t << ": " << dist[t] << endl;}}```代码解析:首先定义了一些常量和全局变量,其中n表示节点数,m表示边数,s 表示起点,t表示终点。
【图论基础】求一个无向图的最短路径(dijkstra)
Time Limit:10000MS Memory Limit:65536K
Total Submit:112 Accepted:46
Description
一个含n个结点的无向图,以矩阵存储方式给出,请求出指定的两个点之间的最短距离。
Input
第一行,一个整数n(0 < n < 1000 ),表示无向图中结点的个数。
接下来是一个n*n的矩阵,表示无向图中各结点之间的联结情况,矩阵中的数值为小于等于1000的下整数,其中0 表示两点之间无直接连接。
最后一行,两个整数i,j。
表示求解i点到j点的最短距离。
Output
一个数值,表示指定的两点之间最短距离。
Sample Input
2
0 2
2 0
1 2
Sample Output
2
Source
∙var
∙ i,j,k,n,min:longint;
∙ x,y:longint;
∙ a:array[1..1000,1..1000] of longint;
∙ b:array[1..1000] of longint;
∙ c:array[1..1000] of boolean;
∙begin
∙ readln(n);
∙ for i:=1 to n do
∙ for j:=1 to n do read(a[i,j]);
∙ readln(x,y);
∙ fillchar(c,sizeof(c),0);
∙ fillchar(b,sizeof(b),$7);
∙ k:=x; b[x]:=0;
∙ for i:=1 to n-1 do begin
∙ c[k]:=true;
∙ for j:=1 to n do
∙ if (a[k,j]<>0) and not c[j] and (a[k,j]+b[k]<b[j]) then ∙ b[j]:=a[k,j]+b[k];
∙ min:=maxlongint; k:=0;
∙ for j:=1 to n do if (b[j]<min) and not c[j] then begin ∙ min:=b[j]; k:=j;
∙ end;
∙ end;
∙ writeln(b[y]);
∙end.
【图论基础】有向图中任意两点最短路径(floyd)
Time Limit:10000MS Memory Limit:65536K
Total Submit:69 Accepted:35
Description
一个含n个结点的有向图(注意:是有向图!!),以矩阵存储方式给出,请求出指定的多组两个点之间的最短距离及其最短路径。
Input
第1行,一个整数n(0 < n < 300 ),表示有向图中结点的个数。
第2行到第(n+1)行,是一个n*n的矩阵,表示无向图中各结点之间的联结情况,矩阵中的数据为小于1000的正整数,其中-1 表示无穷大!!
第(n+2)行,一个整数m,表示接下来有m组顶点< i , j >对,其中,i 是起点,j是终点,且i不等于j。
接下来有m行,每行两个整数,中间一个空格间隔,分别表示i和j,表示求解i点到j点的最短距离及最短路径。
注:输入数据已经确保答案每一组顶点间的最短路径是唯一的,无多解数据存在,顶点编号用数字表示,从1开始编号,至n结束!
Output
共2m 行。
第(m-1)*2+1行,一个整数,表示第m组顶点的最短距离,若两点间距离为无穷大,则输出-1。
第(m-1)*2+2行,用顶点编号表示的路径序列,各顶点编号间用一个空格间隔,表示第m组顶点的最短路径,若两点间距离为无穷大,则输出的路径序列为-1。
Sample Input
3
0 4 11
6 0 2
3 -1 0
2
2 1
3 2
Sample Output
5
2 3 1
7
3 1 2
Source
虽然我不会用floyd 写,但这还是一种方法~~~
∙var
∙ i,j,k,z,n,m,x,y,min:longint;
∙ a:array[1..300,1..300] of longint;
∙ d,f:array[1..300] of longint;
∙ e:array[1..300] of boolean;
∙procedure dfs(y:longint);
∙begin
∙ if f[y]<>0 then dfs(f[y]);
∙ write(y,' ');
∙end;
∙
∙begin
∙ readln(n);
∙ for i:=1 to n do
∙ for j:=1 to n do read(a[i,j]);
∙ readln(m);
∙ for z:=1 to m do begin
∙ readln(x,y);
∙ fillchar(d,sizeof(d),$7);
∙ fillchar(e,sizeof(e),0);
∙ fillchar(f,sizeof(f),0);
∙ k:=x; d[x]:=0;
∙ for i:=1 to n-1 do begin
∙ e[k]:=true;
∙ for j:=1 to n do if a[k,j]>0 then
∙ if (d[k]+a[k,j]<d[j]) and not e[j] then begin
∙ d[j]:=d[k]+a[k,j]; f[j]:=k;
∙ end;
∙ min:=maxlongint; k:=0;
∙ for j:=1 to n do if not e[j] and (min>d[j]) then begin ∙ min:=d[j]; k:=j;
∙ end;
∙ if k=0 then break;
∙ end;
∙ if d[y]<10000000 then begin
∙ writeln(d[y]);
∙ dfs(y);
∙ writeln;
∙ end
∙ else begin
∙ writeln(-1); writeln(-1);
∙ end
∙ end ∙end.。