例:动态规划解最短路径问题:

合集下载

最短路径规划实验报告

最短路径规划实验报告

1.实验题目:单源最短路径的dijkstra解法两点间最短路径的动态规划解法Dijkstra算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。

主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。

Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。

注意该算法要求图中不存在负权边。

问题描述:在无向图G=(V,E) 中,假设每条边E[i] 的长度为w[i],找到由顶点V0 到其余各点的最短路径。

(单源最短路径)2.算法描述:1)算法思想:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径, 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。

在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v 到U中任何顶点的最短路径长度。

此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。

2)算法步骤:a.初始时,S只包含源点,即S={v},v的距离为0。

U包含除v外的其他顶点,即:U={其余顶点},若v与U中顶点u有边,则<u,v>正常有权值,若u不是v的出边邻接点,则<u,v>权值为∞。

b.从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。

c.以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。

d.重复步骤b和c直到所有顶点都包含在S中。

用动态规划模型求解最短路问题的研究

用动态规划模型求解最短路问题的研究

当‘
,
,
“ 发 点 只有一 个

,

则‘
,

,
,

距离为
一 至此 , 可 得最优决 策 函数序列 气 , 其 中

飞 万 。‘

算法 , 矩 阵算法 , 动态规划方法等
枷 算法可用 于计算 网络 图中某一点到各 点的最短距
离 , 但实 际问题 中有时需要求 网络 中所 有各点 之间 的最短 距离 , 如果 仍采用
加 算法分别计 算 ,
效率很低 矩 阵算法可用于 计算所 有节点之 间的最短路 径 , 但计算 量较大 , 适 于用计算机计算 动态规

,
,
…,
,
式 中 为 阶段变量 为阶段数 , 。分别 为第 阶段 的状态 变量和决 策变量
动态规划可 分为正 向思维法和逆 向思 维法 , 逆 向思 维法是 指从问题 目标状 态 出发倒 推 回初始状
态或边界状 态 的思维方法 , 而 正 向思维法则正 好与之相反 在运 用求解最短路问题时 , 则有两种解法
划方法主要是研究与解决多阶段决策过程 的最优化问题 , 是求最短路 问题的好算法 , 动态规划方法是
将求解分成多 阶段进行 , 求 出的不 但是全过程 的解 , 而 且包括后部子过程 的一族解 , 在某些情况下 , 实
际问题需要族解时 , 更显其优越性
动态规划所处理的问题 是一个 多阶段 决策间题 , 一 般由初始状态开始 , 通过对中间阶段决策 的选
收稿 日期 二双刃名一 一
— 作者简介 王 百级 盯
, 女 , 白城 师范 学院毅学 系讲 师 , 研 究方 向 橄分 方 权理 论 。
用动态规划模型求解最短路问题 的研究

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

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

动态规划实现最短路径问题⼀、设计最短路径的动态规划算法 <算法导论>中⼀般将设计动态规划算法归纳为下⾯⼏个步骤: 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算法和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. 最短路径问题简介最短路径问题是图论中的经典问题之一,旨在找到从图中一点到另一点的最短路径。

通常使用距离或权重来衡量路径的长度。

最短路径问题有多种算法可以解决,其中动态规划算法是一种常用且高效的方法。

2. 动态规划算法原理动态规划算法的核心思想是将原问题分解为更小的子问题,并存储已解决子问题的结果,以供后续使用。

通过逐步解决子问题,最终得到原问题的解。

在最短路径问题中,动态规划算法将路径分解为多个子路径,并计算每个子路径的最短距离。

3. 动态规划算法步骤(1)定义状态:将问题转化为一个状态集合,每个状态表示一个子问题。

(2)确定状态转移方程:通过递推或计算得到子问题之间的关系,得到状态转移方程。

(3)确定初始状态:设置与最小子问题相关的初始状态。

(4)递推求解:根据状态转移方程,逐步计算中间状态,直到得到最终解。

(5)回溯路径:根据存储的中间状态,找到最短路径。

4. 动态规划算法示例以经典的Dijkstra算法为例,演示动态规划算法在解决最短路径问题中的应用。

假设有带权重的有向图G,其中节点数为n,边数为m。

算法步骤如下:(1)定义状态:对于图G中的每个节点v,定义状态d[v]代表从起点到节点v的最短距离。

(2)确定状态转移方程:d[v] = min(d[u]+w[u,v]),其中u为节点v 的直接前驱节点,w[u,v]为边(u,v)的权重。

(3)确定初始状态:设置起点s的最短距离d[s]为0,其他节点的最短距离d[v]为无穷大。

(4)递推求解:根据状态转移方程逐步计算中间状态d[v],更新最短距离。

(5)回溯路径:根据存储的前驱节点,从终点t开始回溯,得到最短路径。

5. 动态规划算法的优缺点优点:(1)求解速度快,适用于大规模问题。

动态规划算法实现多段图的最短路径问题算法设计与分析实验报告

动态规划算法实现多段图的最短路径问题算法设计与分析实验报告

动态规划算法实现多段图的最短路径问题算法设计与分析实验报告算法设计与分析实验报告实验名称 动态规划算法实现多段图的最短路径问题 评分 实验日期 年 月 日 指导教师 姓名 专业班级 学号一.实验要求1. 理解最优子结构的问题。

有一类问题的活动过程可以分成若干个阶段,而且在任一阶段后的行为依赖于该阶段的状态,与该阶段之前的过程如何达到这种状态的方式无关。

这类问题的解决是多阶段的决策过程。

在50年代,贝尔曼(Richard Bellman )等人提出了解决这类问题的“最优化原理”,从而创建了最优化问题的一种新的算法设计方法-动态规划。

对于一个多阶段过程问题,是否可以分段实现最优决策,依赖于该问题是否有最优子结构性质,能否采用动态规划的方法,还要看该问题的子问题是否具有重叠性质。

最优子结构性质:原问题的最优解包含了其子问题的最优解。

子问题重叠性质:每次产生的子问题并不总是新问题,有些子问题被反复计算多次。

问题的最优子结构性质和子问题重叠性质是采用动态规划算法的两个基本要素。

2.理解分段决策Bellman 方程。

每一点最优都是上一点最优加上这段长度。

即当前最优只与上一步有关。

U s 初始值,u j 第j 段的最优值。

⎪⎩⎪⎨⎧+==≠}.{min ,0ijiji js w u u u3.一般方法1)找出最优解的性质,并刻画其结构特征;2)递归地定义最优值(写出动态规划方程);3)以自底向上的方式计算出最优值;4)根据计算最优值时得到的信息,构造一个最优解。

步骤1-3是动态规划算法的基本步骤。

在只需要求出最优值的情形,步骤4可以省略,步骤3中记录的信息也较少;若需要求出问题的一个最优解,则必须执行步骤4,步骤3中记录的信息必须足够多以便构造最优解。

二.实验内容1.编程实现多段图的最短路径问题的动态规划算法。

2.图的数据结构采用邻接表。

3.要求用文件装入5个多段图数据,编写从文件到邻接表的函数。

4.验证算法的时间复杂性。

最短路径问题的动态规划算法

最短路径问题的动态规划算法

最短路径问题的动态规划算法最短路径问题的动态规划算法是一种常用的解决路径优化的方法。

动态规划算法的核心思想是将原问题拆分成若干个子问题,通过递推关系找到最优解。

在最短路径问题中,我们通常希望找到从起点到终点的最短路径。

首先,我们需要定义一个二维数组dp,其中dp[i][j]表示从起点到达坐标(i, j)的最短路径长度。

初始化dp数组,将起点的值设为0,其他位置的值设为无穷大(即表示不可达)。

接下来,我们需要确定动态规划的状态转移方程。

对于任意一个坐标(i, j),它可以从上方的坐标(i-1, j)、左方的坐标(i, j-1)、右方的坐标(i, j+1)、下方的坐标(i+1, j)四个位置中的某一个到达。

因此,可以得到状态转移方程如下:
dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i][j+1], dp[i+1][j]) + 1
其中,min表示取其中的最小值。

通过以上状态转移方程,我们可以逐步更新dp数组,直到最终得到终点的最短路径长度。

需要注意的是,动态规划算法的时间复杂度通常是O(n^2),其中n 表示问题规模。

因此,在处理大规模最短路径问题时,需要考虑算法的效率,可能需要进行剪枝等优化操作。

总的来说,最短路径问题的动态规划算法在路径优化领域有着重要的应用价值,通过合理定义状态转移方程和优化算法效率,可以找到从起点到终点的最短路径长度,为路径规划提供有效的解决方案。

floyd算法求最短路径问题的步骤

floyd算法求最短路径问题的步骤

floyd算法求最短路径问题的步骤Floyd算法是一种用于求解最短路径问题的动态规划算法。

它能够计算出任意两点之间的最短路径长度,并且可以同时得到最短路径的具体路径。

下面是Floyd算法求解最短路径问题的步骤:
1. 创建一个二维数组dist,用于存储任意两点之间的最短路径长度。

初始化时,将所有的元素设为无穷大(表示不可达),但对角线上的元素设为0。

2. 创建一个二维数组path,用于存储任意两点之间最短路径的中间节点。

初始化时,将所有的元素设为-1。

3. 根据给定的图或者网络,将直接相连的两个节点之间的距离填入`dist`数组中。

如果两个节点之间不存在边,则将距离设为无穷大。

4. 使用三重循环进行计算。

外层循环遍历所有可能的中间节点,中间层循环遍历所有可能的起始节点,内层循环遍历所有可能的目标节点。

如果通过中间节点k可以使得从起始节点i到目标节点j的路径更短,即dist[i][k] + dist[k][j] < dist[i][j],则更新dist[i][j]为新的最短路径长度,并更新path[i][j]为中间节点k。

5. 循环结束后,dist数组中存储的就是任意两点之间的最短路径长度,path数组中存储的是最短路径的中间节点。

6. 如果需要获取具体的最短路径,可以通过回溯path数组来获取。

以起始节点i和目标节点j为例,可以通过不断查找path[i][j],直到找到-1为止,得到最短路径
的节点序列。

以上就是Floyd算法求解最短路径问题的步骤。

该算法的时间复杂度为O(n^3),其中n为节点的数量。

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

● 例:动态规划解最短路径问题:
步骤(1)、(2)已实现。

最优子结构:从起点到终点的最短路径包含了该路径
上各点到终点的最短路径。

递归公式:设v 为图中一个顶点,v 1, v 2,…, v m 为v 的
直接后继,cost(v)表示v 到终点的最短路径
长度,c[u, w]表示边<u,w>上的权,t 为终点,
则cost 满足如下递归公式:
⎪⎪⎩
⎪⎪⎨⎧≠∞=≠+=≤≤无后继且有后继且v t v , t
v , 0v t v , )}cost(v ] v {c[v,min cost(v)i i m i 1
步骤(3) 计算最优值(求最短路径长度):
设有向网G含n个顶点,用邻接矩阵c[1..n, 1..n]表示,起点为s,终点为t 。

有关信息的保存:
数组cost[1..n]: 存储子问题的解。

(cost[i]表示从顶点i到终点t的最短路径长
度。


数组succ[1..n]: 存储最短路径的有关信息。

(succ[i]表示顶点i到终点t的最短路径上顶
点i的直接后继。


原问题的最优值为cost[s]。

(1) 自底向上的迭代算法
关键:根据递归公式确定迭代顺序(即子问题的求解顺序)。

原则:计算cost[i]时,顶点i的所有后继的cost值应先计算。

计算顺序:按图G的逆拓扑排序顺序。

算法SHORTEST_ROUTE_LEN1
输入:有向网G的顶点数n, 邻接矩阵c[1..n, 1..n], 起点s和终点t , 1<=s, t<=n。

输出:G的从起点s到终点t的最短路径长度cost[s]和最短路径有关信息的数组succ[1..n]。

//对图G拓扑排序,结果存于数组a[1..n]
中。

toposort(c, n, a)
j=n
while a[j]< >t j=j-1 //找出j使得a[j]=t 。

for i=j+1 to n cost[a[j]]=∞//排除无关的顶
点。

cost[t]=0 //从终点开始迭代。

while a[j]< >s
j=j-1; k=a[j]; i0=0 ; min=∞
for i=1 to n
if c[k, i]+cost[i]<min then
i0=i; min=c[k, i]+cost[i]
end if
end for
cost[k]=min ; succ[k]=i0
end while
end SHORTEST_ROUTE_LEN1
(2) 自顶向下的递归算法
关键:对每个子问题标记是否计算过,同一子问题只在第一次递归调用时计算并存储结果。

标记:未求出cost[i]时,cost[i]=-1 。

算法SHORTEST_ROUTE_LEN2
输入:有向网G的顶点数n, 邻接矩阵c[1..n, 1..n], 起点s和终点t , 1<=s, t<=n。

输出:G的从起点s到终点t的最短路径长度minlen 和最短路径有关信息的数组succ[1..n]。

for i=1 to n cost[i]=-1
minlen=routelength(s)
end SHORTEST_ROUTE_LEN2
过程routelength( j )
// 求G中从顶点j到终点t的最短路径长度
cost[j]并返回,//同时求该路径上各顶点的直接
后继存于数组succ中。

if cost[j]=-1 then //cost[j]还未求出
if j=t then cost[j]=0
else
min=∞ ; i0=0
for i=1 to n
if c[j, i]< ∞ then //顶点i为顶点j的后继
x=routelength( i ) //求i到t的最短路
径长度
if c[j, i]+x<min then
min=c[j, i]+x; i0=i
end if
end if
end for
cost[j]=min; succ[j]=i0;
end if
end if
return cost[j]
end routelength
步骤(4) 构造最优解(设存在从起点s到终点的路径) 算法SHORTEST_ROUTE
输入:有向网G的从起点s到终点t的最短路径信息数组succ[1..n]
输出: 有向网G的从起点s到终点t的最短路径。

i=1; b[i]=s
while b[i]< >t
b[i+1]=succ[b[i]]
i=i+1
end while
输出b[1..i]
end SHORTEST_ROUTE
最坏情况下时间复杂性:
算法SHORTEST_ROUTE_LEN1(或2):Θ(n2) 算法SHORTEST_ROUTE:Θ(n)。

相关文档
最新文档