用动态规划法实现有向图的最短路径问题。

合集下载

动态规划求最短路径的两种方法

动态规划求最短路径的两种方法

动态规划1.最短路线问题解(1):将上图该画成下图:记a (1,2)=4,a(1,3)=5,依次类推,表示每个点和值的关系。

逆序递推方程:⎪⎩⎪⎨⎧==+++=0)6(61,2,3,4,5)}1(1),({min )(s f k k s k f k u k s k d k uk s k fAB 1B 2C 1 C 2C 3 C 4D 1D 2 D 3E 1 E 2F4523 6 8 7 75845348435 6 2 314 31234 5 6 789 101112134523 6 8 7 7584534 8435 6 2 314 3如图各状态:逆序递推,找出上一个状态到下一阶段的最小路径值。

例如,当K=4时,状态 它们到F 点需经过中途 点E ,需一一分析从E 到 F 的最短路:先说从D1到F 的最短路 有两种选择:经过 E1, E2, 比较最短。

这说明由 D1 到F 的最短距离为7,其路径为AB 1B 2C 1 C 2C 3 C 4D 1 D 2 D 3E 1 E 2F4523 6 87 75845348435 62 31 4 3第1阶段 第2阶段 第3阶段 第4阶段 第5阶段状态 1状态 2状态3状态 4状态 5状态 6)}(),(),(),(m in{)(252141511414E f E D d E f E D d D f ++=.7}35,43min{=++=.11F E D →→},,{3214D D D S =a=[0,4,5,inf,inf,inf,inf,inf,inf,inf,inf,inf,inf 4,0,inf,2,3,6,inf,inf,inf,inf,inf,inf,inf 5,inf,0,inf,8,7,7,inf,inf,inf,inf,inf,inf inf,2,inf,0,inf,inf,inf,5,8,inf,inf,inf,inf inf,3,8,inf,0,inf,inf,4,5,inf,inf,inf,inf inf,6,7,inf,inf,0,inf,inf,3,4,inf,inf,inf inf,inf,7,inf,inf,inf,0,inf,8,4,inf,inf,inf inf,inf,5,4,inf,inf,inf,0,inf,inf,3,5,inf inf,inf,inf,8,5,3,8,inf,0,inf,6,2,inf inf,inf,inf,inf,inf,4,4,inf,inf,0,1,3,inf inf,inf,inf,inf,inf,inf,inf,3,6,1,0,inf,4 inf,inf,inf,inf,inf,inf,inf,5,2,3,inf,0,3 inf,inf,inf,inf,inf,inf,inf,inf,inf,inf,4,3,0]; s8=min(a(8,11)+a(11,13),a(8,12)+a(12,13)); s9=min(a(9,11)+a(11,13),a(9,12)+a(12,13)); s10=min(a(10,11)+a(11,13),a(10,12)+a(12,13)); s4=min(a(4,8)+s8,a(4,9)+s9); s5=min(a(5,8)+s8,a(5,9)+s9); s6=min(a(6,9)+s9,a(6,10)+s10); s7=min(a(7,9)+s9,a(7,10)+s10); s2=[a(2,4)+s4,a(2,5)+s5,a(2,6)+s6]; s2=min(s2);s3=[a(3,5)+s5,a(3,6)+s6,a(3,7)+s7]; s3=min(s3);s1=min(a(1,2)+s2,a(1,3)+s3)运行结果为:s8 = 7 s9 = 5 s10 = 5 s4 = 12 s5 = 10 s6 = 8 s7 = 9 s2 =13s3 = 15 s1 = 17结果分析:s 表示每个点到终点的最短距离,那么最短路程为17。

动态规划算法解决路径规划问题

动态规划算法解决路径规划问题

动态规划算法解决路径规划问题路径规划问题是人们在日常生活中经常遇到的问题,就拿地图导航为例,如何规划最短的路线是我们需要解决的问题之一。

在解决这个问题过程中,动态规划算法广泛应用。

下文将详细介绍动态规划算法在路径规划问题中的应用以及算法的实现过程。

一、动态规划算法的基本思想动态规划算法是一种解决多阶段决策问题的近似方法。

在路径规划问题中,能够将整个规划问题转化为多个子问题。

动态规划的核心思想就是将问题划分为多个规模更小的子问题,依次求解并通过子问题的最优解来得到原问题的最优解。

二、动态规划算法在路径规划问题中的应用1. 无障碍路径规划:动态规划算法可以应用于无障碍路径规划问题。

问题的关键在于如何找到一条路径,使得该路径长度最短,同时又具有无障碍的特点。

这里的无障碍指的是路径上没有障碍物,如墙壁、垃圾箱等。

这个问题可以转化为一个最短路径求解问题。

我们可以将整个地图按照一定的步长进行划分,然后根据已知信息求出从当前节点出发到下一个节点的路径长度。

由此,我们可以得到整张地图的最短路径。

2. 避障路径规划:动态规划算法同样适用于避障路径规划问题。

避障路径规划问题与无障碍路径规划问题不同的是,路径上有可能存在一些障碍物。

如何规划避开障碍物的最短路径是该问题的核心。

类似于无障碍路径规划问题,我们可以将整张地图按照一定的步长进行划分,并且将有障碍物的节点标记为不可达,然后以此为基础寻找最短路径。

在实际应用中,我们可以使用A*算法等经典避障算法来进行优化。

三、动态规划算法的实现过程在实现动态规划算法时,需要考虑三个因素:状态、方程和初始状态。

1. 状态:在路径规划问题中,状态代表一个节点的状态和特性,例如所处节点和到达该节点的路径长度。

图的每个节点都可以看作一个状态,不同的状态表示不同的阶段。

2. 方程:在计算下一个子问题时,需要依据已知信息、状态以及阶段之间的关系来求解。

这里的方程通常被称为状态转移方程。

通过利用已知的最短路径信息以及下一个子问题的信息,我们可以推导出相应的状态转移方程。

最短路径的算法

最短路径的算法

最短路径的算法介绍最短路径问题是在图论中经常遇到的一个问题,它的目标是找到两个顶点之间的最短路径。

最短路径的算法有很多种,每种算法都有自己的特点和适用场景。

本文将介绍几种常用的最短路径算法,并对它们的原理和应用进行详细探讨。

Dijkstra算法Dijkstra算法是最经典的最短路径算法之一,它适用于有权重的有向图。

该算法通过逐步扩展路径来求解最短路径。

具体步骤如下:1.初始化距离数组和访问数组,将起始顶点的距离设为0,其余顶点的距离设为无穷大,将起始顶点设为当前顶点。

2.遍历当前顶点的所有邻居顶点,更新其距离值。

如果新的距离值小于原来的距离值,则更新距离值。

3.标记当前顶点为已访问,并将距离最小的未访问顶点设为当前顶点。

4.重复步骤2和步骤3,直到所有顶点都被访问过或者找到目标顶点。

Dijkstra算法的时间复杂度为O(V^2),其中V为顶点数。

该算法可以用于求解单源最短路径问题,即求解一个顶点到其他所有顶点的最短路径。

Bellman-Ford算法Bellman-Ford算法是一种用于解决带有负权边的最短路径问题的算法。

该算法通过逐步放松边来求解最短路径。

具体步骤如下:1.初始化距离数组,将起始顶点的距离设为0,其余顶点的距离设为无穷大。

2.重复以下步骤V-1次,其中V为顶点数:–遍历图中的所有边,对每条边进行放松操作。

放松操作是指通过比较边的起点和终点的距离来更新终点的距离值。

3.检查是否存在负权回路。

如果在第2步的操作中,仍然存在可以放松的边,则说明存在负权回路,无法求解最短路径。

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

该算法可以用于求解单源最短路径问题,并且可以处理带有负权边的图。

Floyd-Warshall算法Floyd-Warshall算法是一种用于解决所有顶点对之间最短路径的算法。

该算法通过动态规划的思想来求解最短路径。

具体步骤如下:1.初始化距离矩阵,将矩阵的对角线元素设为0,如果两个顶点之间存在边,则将矩阵对应位置的元素设为边的权重,否则设为无穷大。

图的最短路径算法

图的最短路径算法

图的最短路径算法图是一种常见的数据结构,它由节点和连接节点的边组成。

在现实生活中,我们常常会遇到需要找到两个节点之间最短路径的问题,比如导航系统中寻找最快的路线。

图的最短路径算法就是解决这类问题的重要工具。

本文将介绍两种常用的最短路径算法:Dijkstra算法和Floyd-Warshall算法。

1. Dijkstra算法Dijkstra算法是一种用于求解单源最短路径的算法,即从一个节点出发,计算该节点到图中其他节点的最短路径。

该算法采用贪心策略,逐步扩展最短路径的范围,直到找到从起始节点到其他节点的最短路径。

具体步骤如下:1)初始化距离数组dist和已访问节点集合visited。

将起始节点的距离设为0,其他节点的距离设为无穷大,同时将所有节点标记为未访问。

2)进入循环,重复以下步骤直到所有节点都被访问:a) 从距离数组dist中选择未访问节点中距离最小的节点u作为当前节点。

b) 将节点u标记为已访问。

c) 遍历当前节点u的所有邻居节点v,并更新其距离dist[v],如果从起始节点经过节点u到达节点v的距离比当前的距离小。

3)循环结束后,距离数组dist中存储的即为起始节点到其他节点的最短路径。

2. Floyd-Warshall算法Floyd-Warshall算法是一种用于求解多源最短路径的算法,即计算图中任意两个节点之间的最短路径。

与Dijkstra算法不同,Floyd-Warshall算法采用动态规划的思想,通过中间节点的遍历来逐步更新当前最短路径。

具体步骤如下:1)初始化距离矩阵dist,其中dist[i][j]表示节点i到节点j的距离。

如果节点i和节点j之间没有直接连接的边,则距离设为无穷大。

2)三重循环依次遍历节点k、i和j。

对于每对节点i和j,如果经过节点k的路径比当前的最短路径更短,则更新最短路径。

dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])3)循环结束后,距离矩阵dist中存储的即为任意两个节点之间的最短路径。

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

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

动态规划实现最短路径问题⼀、设计最短路径的动态规划算法 <算法导论>中⼀般将设计动态规划算法归纳为下⾯⼏个步骤: 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 } 上述代码是将给定的邻接矩阵从⽂件中读取 然后根据输⼊的邻接矩阵求出最短路径。

动态规划算法在路径规划中的应用

动态规划算法在路径规划中的应用

动态规划算法在路径规划中的应用路径规划在日常生活中随处可见,比如搜索最短路线、规划旅游路线、寻找交通路线等等。

其中,动态规划算法被广泛应用于路径规划领域,可解决诸如最短路径、最小花费路径等问题。

这篇文章将介绍动态规划算法在路径规划中的应用。

一、动态规划算法的基本原理动态规划算法是一种求解多阶段决策问题的优化方法。

它将问题分成多个子问题,并分别求解这些子问题的最优解。

最后通过不断合并子问题的最优解得到原问题的最优解。

其基本思想可以用以下三个步骤来概括:1.确定状态:将原问题分解成若干个子问题,每个子问题对应一个状态。

2.确定状态转移方程:确定每个状态之间的转移关系。

3.确定边界条件:确定初始状态和结束状态。

动态规划算法通常包括两种方法:自顶向下的记忆化搜索和自底向上的迭代法。

其中,自顶向下的记忆化搜索依赖于递归调用子问题的解,而自底向上的迭代法则通过维护状态表来解决问题。

二、动态规划算法在路径规划中的应用路径规划是动态规划算法的一个重要应用场景。

动态规划算法可以用来求解最短路径、最小花费路径、最大价值路径等问题。

这里以求解最短路径为例,介绍动态规划算法在路径规划中的应用。

1.问题定义假设我们需要从城市A走到城市B,中途经过若干个城市。

每个城市之间的距离已知,现在需要求出从城市A到城市B的最短路径。

这个问题可以用动态规划算法来求解。

2.状态定义在这个问题中,我们可以用一个二元组(u, v)表示从城市u到城市v的一条路径。

因此,在求解最短路径问题时,我们需要进行状态定义。

通常情况下,状态定义成一个包含一个或多个变量的元组,这些变量描述了在路径中的某个位置、某种状态和其他有关的信息。

在这个问题中,状态定义为S(i,j),它表示从城市A到城市j的一条路径,该路径经过了城市集合{1, 2, …, i}。

3.状态转移方程状态转移方程描述了相邻状态之间的关系,即从一个状态到另一个状态的计算方法。

在求解最短路径问题时,状态转移方程可以定义为:d(i, j) = min{d(i-1, j), d(i, k) + w(k, j)}其中,d(i,j)表示从城市A到城市j经过城市集合{1, 2, …, i}的最短路径长度。

最短路径问题算法

最短路径问题算法

最短路径问题算法最短路径问题算法概述:在图论中,最短路径问题是指在一个加权有向图或无向图中,从一个顶点出发到另外一个顶点的所有路径中,权值和最小的那条路径。

最短路径问题是图论中的经典问题,在实际应用中有着广泛的应用。

本文将介绍常见的几种最短路径算法及其优缺点。

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

动态规划在最短路径问题中的应用

动态规划在最短路径问题中的应用

动态规划在最短路径问题中的应用动态规划是一种解决复杂问题的方法,它将问题分解成更小的子问题,并通过保存子问题的解来避免重复计算,从而提高解决问题的效率。

最短路径问题是在图或者网络中找到从起点到终点的最短路径的问题,可以使用动态规划算法来解决。

本文将介绍动态规划在最短路径问题中的应用及其算法实现。

一、最短路径问题在最短路径问题中,我们需要在图或网络中找到从一个节点到另一个节点的最短路径。

最短路径可以通过边的权重来衡量,权重可以表示距离、时间、代价等。

最短路径问题有多种变体,其中最常见的是单源最短路径和全源最短路径。

单源最短路径问题是在给定一个起点的情况下,找到该起点到其他所有节点的最短路径。

最常用的算法是Dijkstra算法和Bellman-Ford算法。

二、动态规划原理动态规划通过保存子问题的解来避免重复计算,从而提高算法的效率。

它将问题分解成更小的子问题,并使用递推关系来计算子问题的解。

在最短路径问题中,我们可以使用动态规划来计算从起点到每个节点的最短路径。

首先,我们定义一个一维数组dist[]来保存从起点到每个节点的最短路径长度。

初始化时,dist[]的值为无穷大,表示路径长度未知。

然后,我们从起点开始逐步计算每个节点的最短路径长度。

具体的动态规划算法如下:1. 初始化dist[]为无穷大,起点的dist[]为0。

2. 对于每个节点v,按照拓扑顺序进行如下操作:2.1. 对于节点v的所有邻接节点u,如果dist[v] + weight(v, u) < dist[u],则更新dist[u]。

2.2. 拓扑顺序可以根据节点的拓扑顺序进行计算或者使用深度优先搜索(DFS)算法。

三、算法实现下面是使用动态规划算法解决最短路径问题的示例代码:```// 定义图的邻接矩阵和节点个数int graph[MAX][MAX];int numNodes;// 定义dist[]数组来保存最短路径长度int dist[MAX];// 定义拓扑排序和DFS算法需要的变量bool visited[MAX];stack<int> s;// 动态规划算法求解最短路径void shortestPath(int startNode) {// 初始化dist[]数组为无穷大for (int i = 0; i < numNodes; i++) {dist[i] = INT_MAX;}dist[startNode] = 0;// 拓扑排序或DFS计算每个节点的最短路径长度 for (int i = 0; i < numNodes; i++) {if (!visited[i]) {DFS(i);}}// 输出最短路径长度for (int i = 0; i < numNodes; i++) {cout << "Node " << i << ": " << dist[i] << endl; }}// 深度优先搜索void DFS(int node) {visited[node] = true;for (int i = 0; i < numNodes; i++) {if (graph[node][i] != 0 && !visited[i]) {DFS(i);}}s.push(node);}```以上示例代码演示了使用动态规划算法求解最短路径问题的基本原理和步骤。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

动态规划法实现有向图的最短路径实验
实验题目:
设计一个求解有向图,单源最短路径的算法
实验目的:
1)了解,并掌握分支限界算法思想
2)会编写常见算法。

实验要求:
1.编写实验代码
2.分析算法时间和空间复杂度
实验主要步骤:
1 算法代码
package suanfa;
publicclass ShortPath{
privatestatic Integer M = Integer.MAX_VALUE;
publicstaticvoid main(String[]args){
int[][]c={{M,4,2,3,M,M,M,M,M,M},
{M,M,M,M,9,8,M,M,M,M},
{M,M,M,M,6,7,8,M,M,M},
{M,M,M,M,M,4,7,M,M,M},
{M,M,M,M,M,M,M,5,6,M},
{M,M,M,M,M,M,M,8,6,M},
{M,M,M,M,M,M,M,6,5,M},
{M,M,M,M,M,M,M,M,M,7},
{M,M,M,M,M,M,M,M,M,3},
{M,M,M,M,M,M,M,M,M,M}};
shortPath(10,c);
}
publicstaticvoid shortPath(int n,int[][]c){
int[] cost=newint[n];//cost[i]存储i到n-1的子问题的最短路径值
int[] path=newint[n];//path[i]存储状态,使cij+cost[i]最小的j值
//对数组cost[n]和path[n]进行初始化
for(int i=0;i<n-1;i++){
cost[i]=M;
path[i]=-1;
}
cost[9]=0;
for(int i=n-2;i>=0;i--){
for(int j=n-1;j>=i;j--){
//得到i的邻接点
if(c[i][j]<M&&cost[i]>(c[i][j]+cost[j])){
cost[i]=c[i][j]+cost[j];
path[i]=j;
}
}
}
System.out.println("最短路径长度为:"+cost[0]);
System.out.print("最短路径为:");
int i=0;
System.out.print("0");
while(i!=n-1){
System.out.print("-->"+path[i]);
i=path[i];
}
}
}
2 程序运行结果
4 算法复杂度分析
设节点个数为n个
算法的循环的次数为n*n次,算法的时间复杂度为O(n^2)
算法需要保存一个矩阵,故算法的空间复杂度为O(n^2)。

相关文档
最新文档