lecture_11_4动态规划所有点对的最短距离

合集下载

最短路径问题介绍

最短路径问题介绍

最短路径问题介绍全文共四篇示例,供读者参考第一篇示例:最短路径问题是指在一个带有边权的图中,寻找连接图中两个特定节点的最短路径的问题。

在实际生活中,最短路径问题广泛应用于交通运输、通信网络、物流配送等领域。

通过解决最短路径问题,可以使得资源的利用更加高效,节约时间和成本,提高运输效率,并且在紧急情况下可以迅速找到应急通道。

最短路径问题属于图论中的基础问题,通常通过图的表示方法可以简单地描述出这样一个问题。

图是由节点和边组成的集合,节点表示不同的位置或者对象,边表示节点之间的连接关系。

在最短路径问题中,每条边都有一个权重或者距离,表示从一个节点到另一个节点移动的代价。

最短路径即是在图中找到一条路径,使得该路径上的边权和最小。

在解决最短路径问题的过程中,存在着多种算法可以应用。

最著名的算法之一是Dijkstra算法,该算法由荷兰计算机科学家Edsger W. Dijkstra于1956年提出。

Dijkstra算法是一种贪心算法,用于解决单源最短路径问题,即从一个给定的起点到图中所有其他节点的最短路径。

该算法通过维护一个距离数组和一个集合来不断更新节点之间的最短距离,直到找到目标节点为止。

除了Dijkstra算法和Floyd-Warshall算法外,还有一些其他与最短路径问题相关的算法和技术。

例如A*算法是一种启发式搜索算法,结合了BFS和Dijkstra算法的特点,对图中的节点进行评估和排序,以加速搜索过程。

Bellman-Ford算法是一种解决含有负权边的最短路径问题的算法,通过多次迭代来找到最短路径。

一些基于图神经网络的深度学习方法也被应用于最短路径问题的解决中,可以获得更快速和精确的路径搜索结果。

在实际应用中,最短路径问题可以通过计算机程序来实现,利用各种算法和数据结构来求解。

利用图的邻接矩阵或者邻接表来表示图的连接关系,再结合Dijkstra或者Floyd-Warshall算法来计算最短路径。

动态规划实现最短路径问题

动态规划实现最短路径问题

动态规划实现最短路径问题⼀、设计最短路径的动态规划算法 <算法导论>中⼀般将设计动态规划算法归纳为下⾯⼏个步骤: 1)分析最优解的结构 2)递归定义最优解的值 3)⾃底向上计算最优解的值 4)从计算的最优解的值上⾯构建出最优解⼆、最短路径的结构 从最优解的结构开始分析(我们假设没有权值为负的路径),对于图G<V,E>的所有结点对最短路径的问题,我们能知道⼀条最短路径的⼦路径都是最短路径。

假设⽤邻接矩阵W=w(ij)来表⽰输⼊带权图,考虑从结点i到结点j的⼀条最短路径p,如果p最多有m(m为有限值)条边。

若i=j,则p的权值为0⽽且不包含其他边。

若i ≠ j,可以将i到j的路径转换为i -> k、k->j。

三、⼀个给定的图 1)给定⼀个有向图 2)我们可以给出这个有向图的邻接矩阵四、C++实现1 #include <iostream>2 #include<fstream>3 #include<sstream>4 #include<vector>5 #include<string>6using namespace std;7const int Max_Num = 100;89 typedef struct Point {10int n; //点的个数11double p[Max_Num];12double q[Max_Num];13int root[Max_Num][Max_Num];14double w[Max_Num][Max_Num];15double e[Max_Num][Max_Num];16 }Point;1718 vector<Point> points;19 vector<string> res;20 vector<int> num;2122void file_read();23void createPoint();24void optimalBST();25void printRoot(Point P);26void printOptimalBST(int i, int j, int r, Point P, ofstream &fileWrite);27 template <class Type>28 Type stringToNum(const string& str) {29 istringstream iss(str);30 Type num;31 iss >> num;32 iss.str("");33return num;34 }3536void file_read() {37string str2, str1 = "", result;38 ifstream fileRead("in.dat");39if (fileRead.is_open()) {40while (getline(fileRead, str2, '\n')) {41if (str2.find("") != -1) {42 str1.append(str2 + "");43 }44else {45 num.push_back(stringToNum<int>(str2));46if (str1 != "") {47 res.push_back(str1);48 }49 str1 = "";50 }51 }52 res.push_back(str1);53 fileRead.close();54 }55 }5657void createPoint() {58string temp;59 Point P;60for (int i = 0; i < res.size(); i++) {61 vector<string> temp_str; //存放按照空格分开后的数字62int n = num[i];63 stringstream input(res[i]);64while (input >> temp) {65 temp_str.push_back(temp);66 }67 P.n = n;68for(int k = 0; k<=n; k++) P.p[k] = stringToNum<double>(temp_str[k]);69for(int k = n + 1; k<temp_str.size(); k++) P.q[k-(n+1)] = stringToNum<double>(temp_str[k]);70 points.push_back(P);71 }72 }7374//根据书上的伪代码:接收概率列表p1....pn和q0.....qn以及规模n作为输⼊计算出e和root75void optimalBST(){76 Point P;77for(int i = 0; i<res.size(); i++) {78 vector<string> temp_str; //存放按照空格分开后的数字79int n = num[i];80string temp;81 stringstream input(res[i]);82while (input >> temp) {83 temp_str.push_back(temp);84 }85 P.n = n;8687for(int k = 0; k<=n; k++) P.p[k] = stringToNum<double>(temp_str[k]);88for(int k = n + 1; k<temp_str.size(); k++) P.q[k-(n+1)] = stringToNum<double>(temp_str[k]); 8990//初始化只包括虚拟键的⼦树91for (int i = 1;i <= P.n + 1;++i){92 P.w[i][i-1] = P.q[i-1];93 P.e[i][i-1] = P.q[i-1];94 }95//由下到上,由左到右逐步计算96for (int len = 1;len <= P.n;++len){97for (int i = 1;i <= P.n - len + 1;++i){98int j = i + len - 1;99 P.e[i][j] = Max_Num;100 P.w[i][j] = P.w[i][j-1] + P.p[j] + P.q[j];101//求取最⼩代价的⼦树的根102for (int r = i;r <= j;++r)103 {104double temp = P.e[i][r-1] + P.e[r+1][j] + P.w[i][j];105if (temp < P.e[i][j])106 {107 P.e[i][j] = temp;108 P.root[i][j] = r;109 }110 }111 }112 }113 points.push_back(P);114 }115 }116117void printOptimalBST(int i, int j, int r, Point P, ofstream &fileWrite){118int root_node = P.root[i][j];//⼦树根节点119if (root_node == P.root[1][P.n]){120//输出整棵树的根121 fileWrite << "k" << root_node << "是根" << endl;122 printOptimalBST(i, root_node - 1, root_node, P, fileWrite);123 printOptimalBST(root_node +1 , j, root_node, P, fileWrite);124return;125 }126127if (j < i - 1){128return;129 }else if (j == i - 1){//遇到虚拟键130if (j < r)131 fileWrite << "d" << j << "是" << "k" << r << "的左孩⼦" << endl;132else133 fileWrite << "d" << j << "是" << "k" << r << "的右孩⼦" << endl;134return;135 }136else{//遇到内部结点137if (root_node < r)138 fileWrite << "k" << root_node << "是" << "k" << r << "的左孩⼦" << endl; 139else140 fileWrite << "k" << root_node << "是" << "k" << r << "的右孩⼦" << endl; 141 }142 printOptimalBST(i, root_node - 1, root_node, P, fileWrite);143 printOptimalBST(root_node + 1, j, root_node, P, fileWrite);144 }145146//输出最优⼆叉查找树所有⼦树的根147void printRoot(Point P){148 cout << "各⼦树的根:" << endl;149for (int i = 1;i <= P.n;++i){150for (int j = 1;j <= P.n;++j){151 cout << P.root[i][j] << "";152 }153 cout << endl;154 }155 cout << endl;156 }157158int main(){159 file_read();160 optimalBST();161 ofstream fileWrite("out.dat");162 Point P ;163for(int i = 0; i<points.size(); i++) {164 P = points[i];165 printRoot(P);166 printOptimalBST(1,P.n,-1, P, fileWrite);167 }168 fileWrite.clear();169return0;170 } 上述代码是将给定的邻接矩阵从⽂件中读取 然后根据输⼊的邻接矩阵求出最短路径。

图论中的最短路径算法

图论中的最短路径算法

图论中的最短路径算法图论是数学的一个分支,研究图的性质和图之间的关系。

在图论中,最短路径算法是一类重要的算法,用于寻找图中两个顶点之间的最短路径。

本文将介绍图论中的几种常见的最短路径算法。

一、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)边权。

动态规划所有点对的最短距离课件

动态规划所有点对的最短距离课件
• 原问题:每个顶点到其他所有顶点的最 短距离
• 最小的子问题D0:从顶点i (不得经过任 何其他顶点)到顶点j的距离;
• 子问题D1:从顶点i(可以经过顶点1, 不得经过其他任何其他顶点)到顶点j的 距离。
动态规划所有点对的最短距离课件
• 子问题Dk:从顶点i(可以经过顶点1、 顶点2、……顶点k,不得经过任何其他 顶点)到顶点j的距离。
动态规划所有点对的最短距离课件
8.3 单源最短路径
Dijkstra算法的迭代过程:
迭代
S
u dist[2] dist[3] dist[4] dist[5]
初始
{1}
-
10 maxint 30
100
1
{1,2}
2
10
60
2
{1,2,4}
4
10
50
3
{1,2,4,3} 3
10
50
4
{1,2,4,3,5} 5
• 用动态规划来解决
动态规划所有点对的最短距离课件
选做题
1、设A和B是两个字符串。我们要用最少的字符 操作将字符串A转换为字符串B。这里所说的字 符串操作包括:
(1) 删除一个字符; (2) 插入一个字符; (3) 将一个字符改为另一个字符; 将字符串A变换为字符串B所用的最少字符操作成
为字符串A到字符串B的编辑距离,记为d(A,B)。 试设计一个有效算法,对任给的两个字符串A和 B,求他们的编辑距离d(A,B) A=“abcde”,B=“acdefa”
计算过程
• 例:考虑下图所示的带权有向图,求所 有顶点之间的最短距离。
1
2
1
89
1
V= 2
029

点到点的最短路径算法

点到点的最短路径算法

点到点的最短路径算法
点到点的最短路径算法在计算机科学中是一个非常常见的问题,其主要用于在图中找到从一个点到另一个点的最短路径。

以下是一些常见的最短路径算法:
1. Dijkstra算法:这是一种用于在图中查找单源最短路径的算法。

其主要思想是从源点开始,每次从未访问过的节点中选择距离最短的节点,然后更新其邻居节点的距离。

这种算法不能处理负权重的边。

2. Bellman-Ford算法:这种算法可以处理带有负权重的边,并且可以找到从源点到所有其他节点的最短路径。

其主要思想是通过反复松弛所有边来找到最短路径。

如果图中存在负权重的循环,则该算法可能无法找到最短路径。

3. Floyd-Warshall算法:这是一种用于查找所有节点对之间的最短路径的算法。

其主要思想是通过逐步添加中间节点来找到最短路径。

这种算法的时间复杂度较高,为O(n^3),其中n是图中的节点数。

4. A(A-Star)算法:这是一种启发式搜索算法,用于在图中找到最短路径。

它使用启发式函数来指导搜索方向,通常可以更快地找到最短路径。

A算法的关键在于启发式函数的选择,该函数应该能够准确地估计从当前节点到目标节点的距离。

这些算法都有其各自的优点和缺点,具体选择哪种算法取决于具体的问题和场景。

最短距离求解题技巧

最短距离求解题技巧

最短距离求解题技巧最短距离求解问题是在计算机科学和运筹学中非常重要的一个问题。

它在许多领域中都有广泛的应用,包括路径规划、网络优化、数据挖掘等。

在本文中,我将介绍一些求解最短距离问题的常用技巧。

1. Dijkstra算法Dijkstra算法是求解单源最短路径问题的一种经典算法。

它通过逐步确定从源点到其他节点的最短路径,并使用一个优先级队列来选择下一个最近的节点。

Dijkstra算法的时间复杂度为O((V+E)logV),其中V是节点数,E是边数。

2. Bellman-Ford算法Bellman-Ford算法是求解单源最短路径问题的另一种经典算法。

与Dijkstra算法不同的是,Bellman-Ford算法可以处理图中存在负权边的情况。

Bellman-Ford算法通过对所有边进行V-1轮的松弛操作来逐步确定最短路径。

Bellman-Ford算法的时间复杂度为O(VE),其中V是节点数,E是边数。

3. Floyd-Warshall算法Floyd-Warshall算法是求解全源最短路径问题的一种经典算法。

它通过动态规划的方式计算从任意两个节点之间的最短路径。

Floyd-Warshall算法的时间复杂度为O(V^3),其中V是节点数。

Floyd-Warshall算法的优势是可以处理有向图或无向图中存在负权边的情况。

4. A*算法A*算法是一种启发式搜索算法,用于求解从起点到终点的最短路径。

它综合使用节点距离和启发式函数来评估节点的优先级,以选择下一个节点进行扩展。

A*算法通常在路径规划和游戏AI中使用。

A*算法的时间复杂度取决于启发函数的复杂度。

5. 最小生成树算法最小生成树算法是一种用于求解无向图的最短路径问题的算法。

它通过选择边来构建一个连通的生成树,使得树的权重和最小。

常见的最小生成树算法包括Prim算法和Kruskal算法。

Prim算法的时间复杂度为O(ElogV),Kruskal算法的时间复杂度为O(ElogE)。

每对顶点间的最短路径

每对顶点间的最短路径

2 3 4 3 7 5 2 4 1 6 7
4
2
3
4
针对上面的图形,你能否写出M(0) 到M(n) ? 程序上又该如何实现Floyd算法?
FLOYD算法
练习(floyd.c/floyd.in/floyd.out)
输入一个有向图的邻接矩阵格式,输出每对顶点间的最短路径长度 输入第一行为n,表示下面是个n*n的矩阵,接下来就是n*n的矩阵形 式,每个元素值都是整型,如果不能直接到,则是-1 输出也是一个n*n的矩阵形式,每个元素的值为两个顶点间的最短路 径值,如果到不了,则输出-1 样例输入: 3 013 205 320 样例输出: 013 205 320
每对顶点间的最短路径
每对顶点间的最短路径
求每对顶点间的最短路径,可以将每个顶
点作为源点,执行n次迪杰斯特拉算法,时 间复杂度为O(n3) 除了上面的方法,还有一种方法也可以解 决这个问题——弗洛伊德算法
弗阵 基本思想:递推地产生一个矩阵序列
弗洛伊德(Floyd)算法
如何从 M(k-1)变到M(k) ? 从vi到vj的路径上中间点的序号不大于k的最短路径只有以
下两种情况: 第一种情况是中间不经过顶点vk。在这种情况下, M(k) [i,j]= M(k-1) [i,j] 第二种情况是中间经过顶点vk。在这种情况下,必然有 M(k) [i,j]< M(k-1) [i,j]。这条由vi经vk到达vj的最短路径由两段 组成:一段是vi到vk的中间序号不大于k-1的最短路径,即 M(k-1) [i,k],另一段是vk到vj的中间序号不大于k-1的最短路 径,即M(k-1) [k,j] 因此vi到vj的路径上中间点序号不大于k的最短路径必定是 上面两种情况的最小值,因此有 M(k) [i,j]=min{M(k-1) [i,j], M(k-1) [i,k]+ M(k-1) [k,j]}
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2取最6小值83
91∞
130
0
在说D(D(1D11[D从1[3)22)]1=][顶不[2中不3]]:点经从:,经从08过1顶过第顶到顶02点顶点1顶点行3点268到点到1和1:顶:顶j第或点仍点仍一顶2是3是的的列点DD距距0D是0[j[33到离2离]=不][([顶2(3]变]=可点=可07∞6以的以;1;20:经,经过允过因86顶许顶为点点经11)) 过((2顶2))点过过1顶顶是1点点没131:有:0D意D00[义[32]][的[11]]++DD00[[11]][[23]]==118++293==3170
例如,对右图中 的有向图,应用 Dijkstra算法计算从 源顶点1到其它顶点 间最短distan由ce源: 点1到0 顶点10 5的50路径30为:601->4->3->5
path:
01 413
方法一:重复调用Dijkstra算法n次
• 可轮流以每一个顶点为源点,重复调用狄克斯 特拉算法函数Dijkstra() n次,即可求得所有顶
• 子问题Dk:从顶点i(可以经过顶点1、 顶点2、……顶点k,不得经过任何其他 顶点)到顶点j的距离。
• 子问题Dn:从顶点i(可以经过顶点1、 顶点2、……顶点n )到顶点j的距离。
——即原问题
递推关系的建立
• 由di,jk-1推出di,jk的过程如下 若k=0, 由的加did,j入ik,j-k1会推=L引出[i]起d[ji,]j什k的(因么过为变从程化i到,?j不主由允要许不考经允过虑许任的何路是其过他顶顶顶点点点k) 若k到1≤允k 许≤ n路, 过顶点k,有些点间的距离是否会 变的d更i,jk近=m。in{di,jk-1 , di,kk-1 +dk,jk-1}
取取最最小小值值36
算法设计
重要发现:在从Dk-1到Dk的计算过程中中, 第k行和第k列是不变的。(因为说从顶点k到顶点j
或顶点j到顶点k允许经过顶点k是没有意义的)
而在从Dk-1到Dk的计算过程中也只用 到第k行和第k列,也就是说,在这一步 的计算过程中用到的数据都不会被覆盖。
故在算法中仅使用一个矩阵D即可
• 算法中,我们不断更新以下三个数组:
• s数组: s[i],当顶点i加入S时,s[i]置1
• Distance数组: Distance[i]记录原点到 顶点i的最 短特殊路径长度。
• path数组: path[i]记录顶点i在其最短特殊路径 上的前驱顶点。由该数组可求得原点到各点的 最短路径。如:设源点是顶点1, path数组如下
FLOYD算法
• FLOYD(int *L,int n)
• {int *D=(int *)malloc((n+1)*(n+1)*sizeof(int)); • D L {将数组L复制到D};
初始时,S中仅含有源点。设u是G的某一个 顶点,把从源点到u且中间只经过S中顶点的路 称为从源到u的特殊路径,并用数组distance记 录当前每个顶点所对应的最短特殊路径长度。 Dijkstra算法每次从V-S中取出具有最短特殊路 长度的顶点u,将u添加到S中,同时对数组 distance作必要的修改。一旦S包含了所有V中顶 点,distance就记录了从源到所有其它顶点之间 的最短路径长度。
•{
• Int n=G.NumOfVertices();
• for(inti=0;i<n;i++) • Dijkstra(G,i,distance[i],path[i]);
•}
由于狄克斯特拉算法的时间复杂度是O(n2), 所以n次调用狄克斯特拉算法的时间复杂 度是O(n3)。
该问题具有最优子结构性质
计算过程
• 例:考虑下图所示的带权有向图,求所 有顶点之间的最短距离。
1
2
1
89
2
3
6
(a)
1
V= 2
3
029
L= 8 0 6
91∞ 0
(b)
Di,jk:从顶点i(可以经过顶点1、顶点
2、……顶点k)到顶点j的距离。
D( (2212[1))]8[1不过3]9:经 顶从1过 点顶顶2点:D点10到D=21:顶[1]点仍08[23是]+的20DD距11[[9621离]][[(33]]==也29D+可;16=以=8经08过顶20 点962)
从子如子问果问题从题Dk顶D-1k:点-1从i:到顶到顶点子点i(问j可从题以顶D经点k过,k顶走仅点更仅1近、多顶,考点则虑了
一我i如则22到、、果个们保j子……的顶顶需持顶问……距点题点要原点、 顶离i到Di重来k顶 点d到k。i顶,点 k:新的jk顶-1k点从=考距、-点i1顶到j) 顶虑离,j点k从到点从 不的是i顶(顶k距变i不)到可点点离到是j以jk的d的顶从走i经,k距距点kdk过更-1离i离走j,j的+顶k远。:=会距点k,d到更离1i,j甚、kj。近的-1顶至。距?点走离不dk通,jk-,1
第 七 章 动 态 规 划
7.5所有点对的最短路径问题
• 对于一个各边权值均大于0的有n个顶点 的带权有向图G=(V,E),求所有顶点之间 的最短路径和最短距离。
图的邻接矩阵表示法
1
2
1 89
2
6
3
1
V= 2
3
(a)
029
L= 8 0 6
91∞ 0
(b)
复习Dijkstra算法
其基本思想是,设置顶点集合S并不断地作贪 心选择来扩充这个集合。一个顶点属于集合S当 且仅当从源到该顶点的最短路径长度已知。
例如上图中,若路线I和J是A到C的 最优路径,则根据最优化原理,路线J 必是从B到C的最优路线。
子问题的构造
• 原问题:每个顶点到其他所有顶点的最 短距离
• 最小的子问题D0:从顶点i (不得经过任 何其他顶点)到顶点j的距离;
• 子问题D1:从顶点i(可以经过顶点1, 不得经过其他任何其他顶点)到顶点j的 距离。
点之间的最短路径和最短距离。

利用Dijkstra()函数求所有顶点之间的最
短路径算法如下。其中,distance[i][j]中存放着
从顶点i到顶点j的最短距离,path[i][j]中存放着
从顶点i到顶点j的最短路径的前一顶点下标。
• voidShortPath(AdjMWGraph &G, int **distance, int **path)
相关文档
最新文档