最短路算法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
0、令始点Ts=0,并用框住,所有其它节点临时标记 Tj=∞ ; 、 框住, , ∞ 1、从 vs 出发,对其相邻节点 vj1 进行临时标记,有 Tj1=ds,j1 ; 、 出发, 进行临时标记, 2、在所有临时标记中找出最小者,并用框住,设其为 vr 。若此 、在所有临时标记中找出最小者, 框住, 时全部节点都永久标记, 否则到下一步; 时全部节点都永久标记,算法结束;否则到下一步; 3、从新的永久标记节点 vr 出发,对其相邻的临时标记节点进行 、 出发, 再标记, 为其相邻节点, 再标记,设 vj2 为其相邻节点,则 Tj2=min{Tj2, Tr+dr,j2 },返回 , 第2步。 步
j dij i Fra Baidu bibliotekik djk k
4
6.3.2 Floyd-Warshall 算法 (1962) for i=1 to n do dii=∞; ∞ for all eij=0; for j=1 to n do for i=1 to n do if i≠j then ≠ for k=1 to n do if k≠j then ≠ begin dik=min{dik, dij+djk}; if dik>dij+djk then eik=j end;
1
例1 狄克斯特拉算法 ∞ 10 11 ∞
2 10
0 s
1 8 9 3 4
12 15 ∞
5 20 2 2 30
∞ t 31
15
8 4 ∞ 8
7
6
13 ∞ 15
2
Dijkstra最短路算法的特点和适应范围 最短路算法的特点和 最短路算法的特点
• 一种隐阶段的动态规划方法 • 每次迭代只有一个节点获得永久标记,若有两个或两个以上 每次迭代只有一个节点获得永久标记, 节点的临时标记同时最小,可任选一个永久标记;总是从一 节点的临时标记同时最小,可任选一个永久标记; 个新的永久标记开始新一轮的临时标记,是一种深探法 个新的永久标记开始新一轮的临时标记,是一种深探法 • 被框住的永久标记 Tj 表示 vs 到 vj 的最短路,因此 要求 dij≥0, 的最短路, , 次迭代得到的永久标记, 条边, 第 k 次迭代得到的永久标记,其最短路中最多有 k 条边,因 此最多有n 此最多有 −1 次迭代 • 可以应用于简单有向图和混合图,在临时标记时,所谓相邻 可以应用于简单有向图和混合图 在临时标记时, 简单有向图和混合图, 必须是箭头指向的节点; 必须是箭头指向的节点;若第 n−1 次迭代后仍有节点的标记 为 ∞,则表明 vs 到该节点无有向路径 • 如果只求 vs 到 vt 的最短路,则当 vt 得到永久标记算法就结束 的最短路, 了;但算法复杂度是一样的 • 应用 Dijkstra 算法 n−1 次 ,可以求所有点间的最短路 • vs 到所有点的最短路也是一棵生成树,但不是最小生成树 到所有点的最短路也是一棵生成树,
最短路问题
一 、狄克斯特拉算法 (Dijkstra algorithm, 1959)
• 计算两节点之间或一个节点到所有节点之间的最短路
的直接距离(两点之间有边 两点之间有边), 令 dij 表示 vi 到 vj 的直接距离 两点之间有边 ,若两点之间 没有边, 两点之间是有向边, 没有边,则令 dij = ∞,若两点之间是有向边,则 dji = ∞; 令 dii = 0,s 表示始点,t 表示终点 , 表示始点,
• 若网路中存在负回路,则计算 若网路中存在负回路, 会小于0, 中,某些 dii 会小于 ,此时应 中断算法 • 显然,Floyd 算法要进行 显然, n(n-1)2 次加法和比较 • 如何回溯找出任两点之间的最 短路? 短路? • 在Floyd 算法中设一伴随矩阵 E={eik}, eik 记录了 i 到 k 最短 , 路中最后一个中间节点
例 1 中 1 到 7 点的最短路是 1-2-5-7 查伴随矩阵 E 的第一行 1 2 3 4 5 6 7 1 0 0 2 0 2 5 5
5
小结
• 最短路有广泛的应用 (6.3.4节 市话局扩容方案 节 市话局扩容方案) • 最短路的多种形式:无向图,有向图无循环圈,有向 最短路的多种形式:无向图,有向图无循环圈, 图,混合图,无负边权,有负边权,有负回路,k-最 混合图,无负边权,有负边权,有负回路, 最 短路等 • 当存在负权值边时,Floyd算法比 当存在负权值边时, 算法比Dijkstra算法效率高, 算法效率高, 算法比 算法效率高 且程序极简单。 且程序极简单。但Dijkstra算法灵活 算法灵活 • 若图是前向的,则Dijkstra算法也可以求两点间最长路 若图是前向的, 算法也可以求两点间最长路 • 一般情况下,两点间最长路是 NP-complete,但最短 一般情况下, , 路是 P算法 算法 • 两点间 最短路:分为边不相交的和边相交的 两点间k-最短路 最短路: 求边不相交的 最短路非常容易:先求最短路, 不相交的k-最短路非常容易 求边不相交的 最短路非常容易:先求最短路,将该 最短路中的边从网路删去,再用Dijkstra算法可求次最 最短路中的边从网路删去,再用 算法可求次最 短路, 短路,以此类推 6
3
1 Warshall-Floyd算法 (1962) 算法
• Warshall-Floyd算法可以解决有负权值边(弧)的最短路问题 算法可以解决有负权值 算法可以解决有负权值边 • 该算法是一种整体算法,一次求出所有点间的最短路 该算法是一种整体算法, • 该算法不允许有负权值回路,但可以发现负权值回路 该算法不允许有负权值回路 负权值回路, • 该算法基于基本的三角运算 对给定的点间初始距离矩阵{d , 定义 对给定的点间初始距离矩阵 ij},令dii=∞,对所有 i。 ∞ 。 对一 个固定点 j,运算 dik=min{dik, dij+djk}, 对所有 i, k ≠ j , , 三角运算。 注意, i=k) 称为 三角运算。(注意,这里允许 i=k) 执行三角运算, 定理 依次对 j=1,2,…,n 执行三角运算,则 dik 最终等于 i 到 k 间最短路的长度。 间最短路的长度。
j dij i Fra Baidu bibliotekik djk k
4
6.3.2 Floyd-Warshall 算法 (1962) for i=1 to n do dii=∞; ∞ for all eij=0; for j=1 to n do for i=1 to n do if i≠j then ≠ for k=1 to n do if k≠j then ≠ begin dik=min{dik, dij+djk}; if dik>dij+djk then eik=j end;
1
例1 狄克斯特拉算法 ∞ 10 11 ∞
2 10
0 s
1 8 9 3 4
12 15 ∞
5 20 2 2 30
∞ t 31
15
8 4 ∞ 8
7
6
13 ∞ 15
2
Dijkstra最短路算法的特点和适应范围 最短路算法的特点和 最短路算法的特点
• 一种隐阶段的动态规划方法 • 每次迭代只有一个节点获得永久标记,若有两个或两个以上 每次迭代只有一个节点获得永久标记, 节点的临时标记同时最小,可任选一个永久标记;总是从一 节点的临时标记同时最小,可任选一个永久标记; 个新的永久标记开始新一轮的临时标记,是一种深探法 个新的永久标记开始新一轮的临时标记,是一种深探法 • 被框住的永久标记 Tj 表示 vs 到 vj 的最短路,因此 要求 dij≥0, 的最短路, , 次迭代得到的永久标记, 条边, 第 k 次迭代得到的永久标记,其最短路中最多有 k 条边,因 此最多有n 此最多有 −1 次迭代 • 可以应用于简单有向图和混合图,在临时标记时,所谓相邻 可以应用于简单有向图和混合图 在临时标记时, 简单有向图和混合图, 必须是箭头指向的节点; 必须是箭头指向的节点;若第 n−1 次迭代后仍有节点的标记 为 ∞,则表明 vs 到该节点无有向路径 • 如果只求 vs 到 vt 的最短路,则当 vt 得到永久标记算法就结束 的最短路, 了;但算法复杂度是一样的 • 应用 Dijkstra 算法 n−1 次 ,可以求所有点间的最短路 • vs 到所有点的最短路也是一棵生成树,但不是最小生成树 到所有点的最短路也是一棵生成树,
最短路问题
一 、狄克斯特拉算法 (Dijkstra algorithm, 1959)
• 计算两节点之间或一个节点到所有节点之间的最短路
的直接距离(两点之间有边 两点之间有边), 令 dij 表示 vi 到 vj 的直接距离 两点之间有边 ,若两点之间 没有边, 两点之间是有向边, 没有边,则令 dij = ∞,若两点之间是有向边,则 dji = ∞; 令 dii = 0,s 表示始点,t 表示终点 , 表示始点,
• 若网路中存在负回路,则计算 若网路中存在负回路, 会小于0, 中,某些 dii 会小于 ,此时应 中断算法 • 显然,Floyd 算法要进行 显然, n(n-1)2 次加法和比较 • 如何回溯找出任两点之间的最 短路? 短路? • 在Floyd 算法中设一伴随矩阵 E={eik}, eik 记录了 i 到 k 最短 , 路中最后一个中间节点
例 1 中 1 到 7 点的最短路是 1-2-5-7 查伴随矩阵 E 的第一行 1 2 3 4 5 6 7 1 0 0 2 0 2 5 5
5
小结
• 最短路有广泛的应用 (6.3.4节 市话局扩容方案 节 市话局扩容方案) • 最短路的多种形式:无向图,有向图无循环圈,有向 最短路的多种形式:无向图,有向图无循环圈, 图,混合图,无负边权,有负边权,有负回路,k-最 混合图,无负边权,有负边权,有负回路, 最 短路等 • 当存在负权值边时,Floyd算法比 当存在负权值边时, 算法比Dijkstra算法效率高, 算法效率高, 算法比 算法效率高 且程序极简单。 且程序极简单。但Dijkstra算法灵活 算法灵活 • 若图是前向的,则Dijkstra算法也可以求两点间最长路 若图是前向的, 算法也可以求两点间最长路 • 一般情况下,两点间最长路是 NP-complete,但最短 一般情况下, , 路是 P算法 算法 • 两点间 最短路:分为边不相交的和边相交的 两点间k-最短路 最短路: 求边不相交的 最短路非常容易:先求最短路, 不相交的k-最短路非常容易 求边不相交的 最短路非常容易:先求最短路,将该 最短路中的边从网路删去,再用Dijkstra算法可求次最 最短路中的边从网路删去,再用 算法可求次最 短路, 短路,以此类推 6
3
1 Warshall-Floyd算法 (1962) 算法
• Warshall-Floyd算法可以解决有负权值边(弧)的最短路问题 算法可以解决有负权值 算法可以解决有负权值边 • 该算法是一种整体算法,一次求出所有点间的最短路 该算法是一种整体算法, • 该算法不允许有负权值回路,但可以发现负权值回路 该算法不允许有负权值回路 负权值回路, • 该算法基于基本的三角运算 对给定的点间初始距离矩阵{d , 定义 对给定的点间初始距离矩阵 ij},令dii=∞,对所有 i。 ∞ 。 对一 个固定点 j,运算 dik=min{dik, dij+djk}, 对所有 i, k ≠ j , , 三角运算。 注意, i=k) 称为 三角运算。(注意,这里允许 i=k) 执行三角运算, 定理 依次对 j=1,2,…,n 执行三角运算,则 dik 最终等于 i 到 k 间最短路的长度。 间最短路的长度。