From 4fedf3871b4f433b4b3a71f73bc37d1334d45cbd Mon Sep 17 00:00:00 2001 From: yangtengze Date: Sun, 2 Jul 2023 16:38:16 +0800 Subject: [PATCH] 1 --- README.md | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5b68d42..183022c 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,12 @@ ### (1)输入和输出 -确定系统的主要输入和输出,如可以设定的参数,数据文件等,明确其主要作用。 +输入形式: +构建图时,输入顶点、弧涉及的信息,包括:起始地、目的地、长度、该弧此时间段的平均速度等信息; +用户或者客户要输入出发地和目的地,并选择何种最优决策的路线规划。 +输出形式:根据用户需求输出对应信息 +输出最短路程所需要的路线信息和最短路程; +输出最短时间所需要的路线信息和最短时间。 ### (2)数据字典 @@ -124,7 +129,35 @@ 首先,分析对比几种可选的算法设计方案。如是否排序,广度优先或深度优先搜索等。给出每一种设计方案的特点(优势、不足)。然后,综合考虑各种因素(空间、时间、乃至团队成员的水平等),给出你的选择。 -### (1)XXX算法 +### (1)Dijkstra算法 + + +求最短路径Dijkstra算法的实现: + +设置Visited[]保存是否被标记,Dis[]保存用户起点到下标号的节点路径的长度,Father[]保存最短路径上的前一个节点。其他类似于Prim算法。 +算法主体有三步: + +1.更新:找到这样的两个顶点 即 i位置已经被访问 且j位置未被访问 且ij有连接,把(0,i)+(i,j)和(0,j)中的较小者赋给j,并且Father[j] = i即i作为j的前驱节点。 +2.访问:每轮在更新Dis后 判断最小未被标记的顶点 对其访问(vis = 1;) +3.重复1、2 步骤直到Visited[]的值全为1为止。 +然后是输出语句: + +输出用户输入位置到其他各个顶点的最短路径长度: +直接一个循环输出Dis数组的前n位即可 +输出用户输入位置到其他各个顶点的最短路径对应的路线: +首先设置i从0到n的循环每次都将i赋值给VVV作为终点,v是用户输入的起点位置。 +``` +while (Father[vvv] != -1 && Father[vvv] != v) + { + cout << Father[vvv] << "<--"; + vvv = Father[vvv]; + } +``` +根据Father数组内存的节点的前驱关系输出路线。 +以上是迪杰斯特拉算法的基础部分, + +在本程序中由于多次调用了此算法,为了减少重复的代码提高代码的复用性,于是在此算法中增加了一个接口,即一个switch case开关语句,调用迪杰斯特拉时需要在参数列表中给出需要进入的部分以实现不同的功能。 + 给出核心算法的设计,包括伪代码或流程图。多个核心算法,逐一列出。只列举解决问题的核心算法,重点讲清楚是如何解决问题的。 @@ -189,6 +222,8 @@ typedef struct ## 3.2 核心算法的实现 +在验证到其他城市中间不超过 2 个城市时,新建一个二维数组将原二维数组中的权值全部改为1,这样用dijkstra算法得到的权值最小的路径就经过节点最少的路径。 + ```cpp //Dijkstra算法