From cc30a8780a8a1a1f278ce4cfe497711cdc83fc2b Mon Sep 17 00:00:00 2001 From: liu yuting <1446580400@qq.com> Date: Tue, 27 Jun 2023 18:22:01 +0800 Subject: [PATCH 01/12] lyt --- README.md | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/README.md b/README.md index 19801ba..1c59cf9 100644 --- a/README.md +++ b/README.md @@ -66,3 +66,57 @@ 用户输入:无  系统输出:地铁线路和站点在地图上的显示,方便用户更直观地了解线路位置和路线。 2. 系统设计 +2.1 概要设计 +系统划分为以下模块: + 1.用户输入模块:用户通过输入起始站点和终点站点,触发系统查询和计算。 +2.数据存储模块:系统将地铁线路和站点信息存储在一个数据结构中,并提供查询和修改功能。 +3.路径计算模块:该模块通过获取用户输入的起始站点和终点站点,并利用存储在数据结 构中的地铁线路和站点信息,计算出最优路径。 +4.输出模块:该模块将最优路径输出给用户,以便用户按照路径指引乘坐地铁。 +2.2 数据结构设计 +通过比较邻接矩阵、邻接表、查找表和不相交集等数据结构,我们选择使用邻接表作为数据结构。邻接表具有占用空间小、查询速度快等优势,适合储存大量的地铁线路和站点信息。 +邻接表 +邻接表是一种表示图形的数据结构,它用于描述地铁网络中的站点之间的连接关系。在邻接表中,每个站点对应一个链表,链表中的每个节点表示与该站点相邻的另一个站点。具体而言,我们可以用如下的结构体表示邻接表中的每个节点: +struct AdjListNode { + int destination; // 相邻站点编号 + int weight; // 连接权重(例如两站之间的距离、换乘次数等) + struct AdjListNode* next; // 下一个相邻节点的指针 +}; +每个链表的头节点可以由一个数组来维护,例如: + +struct Station { + char name[20]; // 站点名称 + int id; // 站点编号 + struct AdjListNode* head; // 相邻节点链表的头节点指针 +}; +struct Station stations[MAX_STATION_NUM]; // 站点数组 +在这个结构中,我们为每个站点记录了它的名称、编号和相邻节点链表的头节点指针。这样的话,我们就可以通过遍历这些链表来获取某一站点的所有邻居站点。同时,由于链表中的每个节点包含了相邻站点的编号和连接权重,因此我们也可以在搜索路径时方便地计算出经过某一条路径的总长度或换乘次数。 + +示意图如下,表示了一个包含 4 个站点和 5 条连接边的地铁网络的邻接表结构: +stations[]: +index 0 1 2 3 + +---------+---------+---------+---------+ + | name | id | head | | + +---------+---------+---------+---------+ + | "PARK" | 0 | +---|-----+ | + +---------+---------+---------+---------+ + | "GATE" | 1 | +---|-----+ | + +---------+---------+---------+---------+ + | "TOWER" | 2 | +---|-----|--+| + +---------+---------+---------+----|----+ + | "HALL" | 3 | +---|-----+ | + +---------+---------+---------+---------+ + +adj_list[]: +station 0: PARK +head -> O |weight=5| -> 1 |weight=3| -> 2 |weight=1| -> null +station 1: GATE +head -> O |weight=3| -> 0 |weight=4| -> 3 |weight=2| -> 2 |weight=1| -> null +station 2: TOWER +head -> O |weight=1| -> 1 |weight=1| -> 3 |weight=3| -> null +station 3: HALL +head -> O |weight=2| -> 1 |weight=5| -> null +在这个示意图中,stations 数组中的每个元素都包含了它所代表的站点的名称、编号和相邻节点链表的头节点指针。例如,stations[0] 表示 "PARK" 站,它的编号为 0,与相邻的站点是 "GATE"、"TOWER" 和 "HALL"。其中,与 "GATE" 站相连的边的权重为 5,与 "TOWER" 相连的边的权重为 3,与 "HALL" 相连的边的权重为 1。而对应的 adj_list 数组则记录了每个站点相邻节点链表的具体内容,其中每个节点包含了相邻站点的编号和连接权重。 +2.3 算法设计 +我们选择Dijkstra算法作为路径计算模块的核心算法。Dijkstra算法是一种广泛应用于最短路径问题上的算法,具有速度快、结果正确性高、易于实现等优势。它通过不断更新起点到每个点的最短距离,并使用优先队列维护每个点的最短距离,直到计算出终点的最短路径。 +Dijkstra算法 +用户输入起点站和终点站,程序使用图论算法在地铁线路图中寻找到两个站之间的一条最短路径。此时使用Dijkstra算法找出最短路径。 From 6dbdcab9204c1aedec6c8f41a7a560e1929982d8 Mon Sep 17 00:00:00 2001 From: YING <2872351531@qq.com> Date: Mon, 3 Jul 2023 12:10:36 +0800 Subject: [PATCH 02/12] zmy_04 05 --- README.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/README.md b/README.md index 1c59cf9..2d32c75 100644 --- a/README.md +++ b/README.md @@ -120,3 +120,32 @@ head -> O |weight=2| -> 1 |weight=5| -> null 我们选择Dijkstra算法作为路径计算模块的核心算法。Dijkstra算法是一种广泛应用于最短路径问题上的算法,具有速度快、结果正确性高、易于实现等优势。它通过不断更新起点到每个点的最短距离,并使用优先队列维护每个点的最短距离,直到计算出终点的最短路径。 Dijkstra算法 用户输入起点站和终点站,程序使用图论算法在地铁线路图中寻找到两个站之间的一条最短路径。此时使用Dijkstra算法找出最短路径。 +4. 系统测试 +系统测试思路和方法: + +根据设计方案,测试系统的功能是否完备,包括地铁线路查询、路径规划、站点信息查询等。 +针对不同功能,设计测试用例,包括正常情况、边界情况、异常情况等。 +给出输入和预期结果,并记录运行结果和是否通过测试,以便后续分析和修改。 +特殊情况: + +输入为空 +输入为非法字符或格式 +查询的线路、站点不存在 +查询的起点和终点在同一站点 +查询的起点和终点不在同一线路上 +测试用例: + +地铁线路查询: 输入:查询所有地铁线路  +预期结果:返回所有线路信息  +运行结果:通过 +路径规划: 输入:从A站到B站 + 预期结果:返回从A站到B站的最短路径 + 运行结果:通过 +站点信息查询: 输入:查询C站信息 + 预期结果:返回C站的详细信息  +运行结果:通过 +特殊情况: 输入为空、非法字符或格式、查询的线路、站点不存在、查询的起点和终点在同一站点、查询的起点和终点不在同一线路上 + 预期结果:返回错误提示信息 + 运行结果:通过 +5. 总结 + 我们设计的城市地铁导航系统旨在帮助用户方便快捷地查找和选择地铁线路及站点,并提供实时更新的地铁运行状态和乘车提示。我们在创建项目时遇到的问题有为降低空间复杂度,因而采用邻接表存储结构。Dijkstra的时间复杂度是O(n2),效率并不高,我通过查阅文献的方式了解到可以进一步采用优先队列的思路优化它,在存储时就按照从小到大的顺序实现,这样在选择节点时直接取队首距离最小的节点即可,可以将时间复杂度优化到O(logn)左右。 \ No newline at end of file From f40e8e7327d659254c839545674c01096fc137e0 Mon Sep 17 00:00:00 2001 From: YING <2872351531@qq.com> Date: Mon, 3 Jul 2023 12:14:44 +0800 Subject: [PATCH 03/12] zmy_04 05 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2d32c75..a37032a 100644 --- a/README.md +++ b/README.md @@ -148,4 +148,4 @@ Dijkstra算法  预期结果:返回错误提示信息  运行结果:通过 5. 总结 - 我们设计的城市地铁导航系统旨在帮助用户方便快捷地查找和选择地铁线路及站点,并提供实时更新的地铁运行状态和乘车提示。我们在创建项目时遇到的问题有为降低空间复杂度,因而采用邻接表存储结构。Dijkstra的时间复杂度是O(n2),效率并不高,我通过查阅文献的方式了解到可以进一步采用优先队列的思路优化它,在存储时就按照从小到大的顺序实现,这样在选择节点时直接取队首距离最小的节点即可,可以将时间复杂度优化到O(logn)左右。 \ No newline at end of file + 我们设计的城市地铁导航系统旨在帮助用户方便快捷地查找和选择地铁线路及站点,并提供实时更新的地铁运行状态和乘车提示。我们在创建项目时遇到的问题有为降低空间复杂度,因而采用邻接表存储结构。Dijkstra的时间复杂度是O(n2),效率并不高,我通过查阅文献的方式了解到可以进一步采用优先队列的思路优化它,在存储时就按照从小到大的顺序实现,这样在选择节点时直接取队首距离最小的节点即可,可以将时间复杂度优化到O(logn)左右 \ No newline at end of file From dee61cfbb8b20e8bb28381c712dde13067d645d4 Mon Sep 17 00:00:00 2001 From: YING <2872351531@qq.com> Date: Mon, 3 Jul 2023 12:21:19 +0800 Subject: [PATCH 04/12] lzy_03 --- README.md | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/README.md b/README.md index 2d32c75..e38faaa 100644 --- a/README.md +++ b/README.md @@ -120,6 +120,78 @@ head -> O |weight=2| -> 1 |weight=5| -> null 我们选择Dijkstra算法作为路径计算模块的核心算法。Dijkstra算法是一种广泛应用于最短路径问题上的算法,具有速度快、结果正确性高、易于实现等优势。它通过不断更新起点到每个点的最短距离,并使用优先队列维护每个点的最短距离,直到计算出终点的最短路径。 Dijkstra算法 用户输入起点站和终点站,程序使用图论算法在地铁线路图中寻找到两个站之间的一条最短路径。此时使用Dijkstra算法找出最短路径。 +3. 系统实现 + 系统使用C++语言进行开发,使用VScode作为开发工具。 + 本系统的文件结构如下: +- SubwaySystem +  - include +    - SubwaySystem.h +  - src +    - SubwaySystem.cpp +  - test +    - test.cpp +  - CMakeLists.txt +其中,SubwaySystem.h和SubwaySystem.cpp分别实现了地铁系统的数据结构和算法,test.cpp实现了测试用例。 +以下是主要函数的功能: + +SubwaySystem::addNode(Node node):向地铁系统中添加一个节点。 +SubwaySystem::addEdge(Edge edge):向地铁系统中添加一条边。 +SubwaySystem::shortestPath(Node from, Node to):计算从起点到终点的最短路径。 +3.1 核心数据结构的实现 +数据结构的实现 + +本系统使用邻接表来表示地铁系统的图。具体实现如下: + + +struct Node { +    int id; // 节点ID +    string name; // 节点名称 +}; + +struct Edge { +    int from; // 起点ID +    int to; // 终点ID +    int weight; // 权重(距离) +}; + +class SubwaySystem { +public: +/ 添加节点和边 +    void addNode(Node node); +    void addEdge(Edge edge); + +    // 计算两个站点之间的最短路径 +    vector shortestPath(Node from, Node to); + +private: +    // 存储节点和边的数据结构 +    vector nodes_; +    vector>> adjacencyList_; + +    // 计算从起点到终点的最短路径 +    vector dijkstra(int from, int to); +}; + +其中SubwaySystem.h和SubwaySystem.cpp分别实现了地铁系统的数据结构和算法,test.cpp实现了测试用例。 +3.2 核心算法的实现 + 系统的核心算法主要包括最短路径算法和站点搜索算法。 + +最短路径算法采用Dijkstra算法实现,该算法的时间复杂度为O(n^2),其中n为站点数。具体实现方式如下: + +1.初始化距离dist和最短路径标记visited数组。 +2.将起点的距离dist设为0,将visited标记设为false。 +3.对于每个未标记的站点,找出距离起点最近的站点v。 +4.将v标记为已访问,对于v的每个邻居站点u,如果dist[u]>dist[v]+v到u的距离,更新dist[u]为dist[v]+v到u的距离。 +5.重复以上步骤,直到所有站点都被标记为已访问或者没有可访问的站点。 + +站点搜索算法采用DFS算法实现,该算法的时间复杂度为O(n^2),其中n为站点数。具体实现方式如下: + +1.初始化visited数组。 +2.从起点出发,采用深度优先搜索方式,访问所有邻居站点。 +3.将访问过的站点标记为visited。 +4.重复以上步骤,直到找到终点或者没有可访问的站点。 + +通过以上算法的实现,我们可以实现在地铁图中查找两个站点之间最短路径和查找某个站点的所有邻居站点。 4. 系统测试 系统测试思路和方法: From 3399192dd856812d281ff175deb2555968becfdf Mon Sep 17 00:00:00 2001 From: ps2zk5fnt <3496841962@qq.com> Date: Mon, 3 Jul 2023 14:50:29 +0800 Subject: [PATCH 05/12] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index dba9a0a..567ee8d 100644 --- a/README.md +++ b/README.md @@ -21,8 +21,8 @@ | 项目设计 | 代码创建 | 优化改进 | 项目测试 | | 25% | 25% | 25% | 25% | -1. 系统分析 -1.1 问题描述 +#1. 系统分析 +##1.1 问题描述 选择北京地铁,建立地铁站点导航地图,设计一个城市地铁导航系统。根据任意指定的两个站点,能够计算出任意两个站点之间路径长度最短的站点导航,并给出换乘方案。 1.2 可行性分析 From d9a88539733997c9b3a65d9ee23a665109060df3 Mon Sep 17 00:00:00 2001 From: ps2zk5fnt <3496841962@qq.com> Date: Mon, 3 Jul 2023 14:52:12 +0800 Subject: [PATCH 06/12] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 567ee8d..f41b1b7 100644 --- a/README.md +++ b/README.md @@ -65,8 +65,8 @@ 主要作用:在地图上展示各个站点和线路的位置和路线。  用户输入:无  系统输出:地铁线路和站点在地图上的显示,方便用户更直观地了解线路位置和路线。 -2. 系统设计 -2.1 概要设计 +##2. 系统设计 +###2.1 概要设计 系统划分为以下模块: 1.用户输入模块:用户通过输入起始站点和终点站点,触发系统查询和计算。 2.数据存储模块:系统将地铁线路和站点信息存储在一个数据结构中,并提供查询和修改功能。 From d05d95062d35c5a2369dc9c8fbc1ff748253385b Mon Sep 17 00:00:00 2001 From: ps2zk5fnt <3496841962@qq.com> Date: Mon, 3 Jul 2023 14:56:01 +0800 Subject: [PATCH 07/12] Update README.md --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index f41b1b7..061d327 100644 --- a/README.md +++ b/README.md @@ -65,8 +65,8 @@ 主要作用:在地图上展示各个站点和线路的位置和路线。  用户输入:无  系统输出:地铁线路和站点在地图上的显示,方便用户更直观地了解线路位置和路线。 -##2. 系统设计 -###2.1 概要设计 +#2. 系统设计 +##2.1 概要设计 系统划分为以下模块: 1.用户输入模块:用户通过输入起始站点和终点站点,触发系统查询和计算。 2.数据存储模块:系统将地铁线路和站点信息存储在一个数据结构中,并提供查询和修改功能。 @@ -120,7 +120,7 @@ head -> O |weight=2| -> 1 |weight=5| -> null 我们选择Dijkstra算法作为路径计算模块的核心算法。Dijkstra算法是一种广泛应用于最短路径问题上的算法,具有速度快、结果正确性高、易于实现等优势。它通过不断更新起点到每个点的最短距离,并使用优先队列维护每个点的最短距离,直到计算出终点的最短路径。 Dijkstra算法 用户输入起点站和终点站,程序使用图论算法在地铁线路图中寻找到两个站之间的一条最短路径。此时使用Dijkstra算法找出最短路径。 -3. 系统实现 +#3. 系统实现  系统使用C++语言进行开发,使用VScode作为开发工具。 本系统的文件结构如下: - SubwaySystem @@ -137,7 +137,7 @@ Dijkstra算法 SubwaySystem::addNode(Node node):向地铁系统中添加一个节点。 SubwaySystem::addEdge(Edge edge):向地铁系统中添加一条边。 SubwaySystem::shortestPath(Node from, Node to):计算从起点到终点的最短路径。 -3.1 核心数据结构的实现 +##3.1 核心数据结构的实现 数据结构的实现 本系统使用邻接表来表示地铁系统的图。具体实现如下: @@ -173,7 +173,7 @@ private: }; 其中SubwaySystem.h和SubwaySystem.cpp分别实现了地铁系统的数据结构和算法,test.cpp实现了测试用例。 -3.2 核心算法的实现 +##3.2 核心算法的实现  系统的核心算法主要包括最短路径算法和站点搜索算法。 最短路径算法采用Dijkstra算法实现,该算法的时间复杂度为O(n^2),其中n为站点数。具体实现方式如下: @@ -192,7 +192,7 @@ private: 4.重复以上步骤,直到找到终点或者没有可访问的站点。 通过以上算法的实现,我们可以实现在地铁图中查找两个站点之间最短路径和查找某个站点的所有邻居站点。 -4. 系统测试 +#4. 系统测试 系统测试思路和方法: 根据设计方案,测试系统的功能是否完备,包括地铁线路查询、路径规划、站点信息查询等。 @@ -219,5 +219,5 @@ private: 特殊情况: 输入为空、非法字符或格式、查询的线路、站点不存在、查询的起点和终点在同一站点、查询的起点和终点不在同一线路上  预期结果:返回错误提示信息  运行结果:通过 -5. 总结 +#5. 总结  我们设计的城市地铁导航系统旨在帮助用户方便快捷地查找和选择地铁线路及站点,并提供实时更新的地铁运行状态和乘车提示。我们在创建项目时遇到的问题有为降低空间复杂度,因而采用邻接表存储结构。Dijkstra的时间复杂度是O(n2),效率并不高,我通过查阅文献的方式了解到可以进一步采用优先队列的思路优化它,在存储时就按照从小到大的顺序实现,这样在选择节点时直接取队首距离最小的节点即可,可以将时间复杂度优化到O(logn)左右 \ No newline at end of file From b4305bb7dfa95823e133ca555aa0bcdc5e83f0df Mon Sep 17 00:00:00 2001 From: ps2zk5fnt <3496841962@qq.com> Date: Mon, 3 Jul 2023 14:57:01 +0800 Subject: [PATCH 08/12] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 061d327..9302e37 100644 --- a/README.md +++ b/README.md @@ -65,8 +65,12 @@ 主要作用:在地图上展示各个站点和线路的位置和路线。  用户输入:无  系统输出:地铁线路和站点在地图上的显示,方便用户更直观地了解线路位置和路线。 + + #2. 系统设计 ##2.1 概要设计 + + 系统划分为以下模块: 1.用户输入模块:用户通过输入起始站点和终点站点,触发系统查询和计算。 2.数据存储模块:系统将地铁线路和站点信息存储在一个数据结构中,并提供查询和修改功能。 From 4f62053652ca06316f9aca499345c395e973e78b Mon Sep 17 00:00:00 2001 From: ps2zk5fnt <3496841962@qq.com> Date: Mon, 3 Jul 2023 14:58:31 +0800 Subject: [PATCH 09/12] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 9302e37..da063cd 100644 --- a/README.md +++ b/README.md @@ -177,6 +177,8 @@ private: }; 其中SubwaySystem.h和SubwaySystem.cpp分别实现了地铁系统的数据结构和算法,test.cpp实现了测试用例。 + + ##3.2 核心算法的实现  系统的核心算法主要包括最短路径算法和站点搜索算法。 @@ -196,6 +198,8 @@ private: 4.重复以上步骤,直到找到终点或者没有可访问的站点。 通过以上算法的实现,我们可以实现在地铁图中查找两个站点之间最短路径和查找某个站点的所有邻居站点。 + + #4. 系统测试 系统测试思路和方法: From cc893ebf3cd9265db4a33bd2abacebae79f9546e Mon Sep 17 00:00:00 2001 From: ps2zk5fnt <3496841962@qq.com> Date: Mon, 3 Jul 2023 15:00:00 +0800 Subject: [PATCH 10/12] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index da063cd..3fc7834 100644 --- a/README.md +++ b/README.md @@ -141,6 +141,8 @@ Dijkstra算法 SubwaySystem::addNode(Node node):向地铁系统中添加一个节点。 SubwaySystem::addEdge(Edge edge):向地铁系统中添加一条边。 SubwaySystem::shortestPath(Node from, Node to):计算从起点到终点的最短路径。 + + ##3.1 核心数据结构的实现 数据结构的实现 @@ -227,5 +229,7 @@ private: 特殊情况: 输入为空、非法字符或格式、查询的线路、站点不存在、查询的起点和终点在同一站点、查询的起点和终点不在同一线路上  预期结果:返回错误提示信息  运行结果:通过 + + #5. 总结  我们设计的城市地铁导航系统旨在帮助用户方便快捷地查找和选择地铁线路及站点,并提供实时更新的地铁运行状态和乘车提示。我们在创建项目时遇到的问题有为降低空间复杂度,因而采用邻接表存储结构。Dijkstra的时间复杂度是O(n2),效率并不高,我通过查阅文献的方式了解到可以进一步采用优先队列的思路优化它,在存储时就按照从小到大的顺序实现,这样在选择节点时直接取队首距离最小的节点即可,可以将时间复杂度优化到O(logn)左右 \ No newline at end of file From fc6af43c0cd299d5d204c0c66c9bf7c30e9a01e6 Mon Sep 17 00:00:00 2001 From: ps2zk5fnt <3496841962@qq.com> Date: Mon, 3 Jul 2023 20:03:04 +0800 Subject: [PATCH 11/12] Update README.md --- README.md | 76 +++++++++++++++++-------------------------------------- 1 file changed, 23 insertions(+), 53 deletions(-) diff --git a/README.md b/README.md index 3fc7834..29a10eb 100644 --- a/README.md +++ b/README.md @@ -95,31 +95,7 @@ struct Station { struct Station stations[MAX_STATION_NUM]; // 站点数组 在这个结构中,我们为每个站点记录了它的名称、编号和相邻节点链表的头节点指针。这样的话,我们就可以通过遍历这些链表来获取某一站点的所有邻居站点。同时,由于链表中的每个节点包含了相邻站点的编号和连接权重,因此我们也可以在搜索路径时方便地计算出经过某一条路径的总长度或换乘次数。 -示意图如下,表示了一个包含 4 个站点和 5 条连接边的地铁网络的邻接表结构: -stations[]: -index 0 1 2 3 - +---------+---------+---------+---------+ - | name | id | head | | - +---------+---------+---------+---------+ - | "PARK" | 0 | +---|-----+ | - +---------+---------+---------+---------+ - | "GATE" | 1 | +---|-----+ | - +---------+---------+---------+---------+ - | "TOWER" | 2 | +---|-----|--+| - +---------+---------+---------+----|----+ - | "HALL" | 3 | +---|-----+ | - +---------+---------+---------+---------+ - -adj_list[]: -station 0: PARK -head -> O |weight=5| -> 1 |weight=3| -> 2 |weight=1| -> null -station 1: GATE -head -> O |weight=3| -> 0 |weight=4| -> 3 |weight=2| -> 2 |weight=1| -> null -station 2: TOWER -head -> O |weight=1| -> 1 |weight=1| -> 3 |weight=3| -> null -station 3: HALL -head -> O |weight=2| -> 1 |weight=5| -> null -在这个示意图中,stations 数组中的每个元素都包含了它所代表的站点的名称、编号和相邻节点链表的头节点指针。例如,stations[0] 表示 "PARK" 站,它的编号为 0,与相邻的站点是 "GATE"、"TOWER" 和 "HALL"。其中,与 "GATE" 站相连的边的权重为 5,与 "TOWER" 相连的边的权重为 3,与 "HALL" 相连的边的权重为 1。而对应的 adj_list 数组则记录了每个站点相邻节点链表的具体内容,其中每个节点包含了相邻站点的编号和连接权重。 + 2.3 算法设计 我们选择Dijkstra算法作为路径计算模块的核心算法。Dijkstra算法是一种广泛应用于最短路径问题上的算法,具有速度快、结果正确性高、易于实现等优势。它通过不断更新起点到每个点的最短距离,并使用优先队列维护每个点的最短距离,直到计算出终点的最短路径。 Dijkstra算法 @@ -203,33 +179,27 @@ private: #4. 系统测试 -系统测试思路和方法: - -根据设计方案,测试系统的功能是否完备,包括地铁线路查询、路径规划、站点信息查询等。 -针对不同功能,设计测试用例,包括正常情况、边界情况、异常情况等。 -给出输入和预期结果,并记录运行结果和是否通过测试,以便后续分析和修改。 -特殊情况: - -输入为空 -输入为非法字符或格式 -查询的线路、站点不存在 -查询的起点和终点在同一站点 -查询的起点和终点不在同一线路上 -测试用例: - -地铁线路查询: 输入:查询所有地铁线路  -预期结果:返回所有线路信息  -运行结果:通过 -路径规划: 输入:从A站到B站 - 预期结果:返回从A站到B站的最短路径 - 运行结果:通过 -站点信息查询: 输入:查询C站信息 - 预期结果:返回C站的详细信息  -运行结果:通过 -特殊情况: 输入为空、非法字符或格式、查询的线路、站点不存在、查询的起点和终点在同一站点、查询的起点和终点不在同一线路上 - 预期结果:返回错误提示信息 - 运行结果:通过 - - + +(1)输入:1 +结果:输出了所有的站点及简略介绍 +(2)输入:2 +结果:请问您要查询的地点编号是:10 +编号:10 + 地点:雍和宫 + 介绍:位于北京市东城区北二环安定门东大街与雍和宫大街、和平里西街交汇处 +按任意键返回! +(3)输入:3 +结果:请输入查询的地点:3 +到达地点 1的总距离为: 30 , 经过路径为:3 +到达地点 2的总距离为: 60 , 经过路径为:3--->1--->2 +到达地点 3的总距离为: 0 , 经过路径为:3 +到达地点 4的总距离为: 100 , 经过路径为:3--->5--->4 +到达地点 5的总距离为: 50 , 经过路径为:3--->5 +… +(4)输入:4 +结果:请输入查询的地点:3 +请输入目的地点:5 +总距离是: 50 , 经过路径为:3--->5 + #5. 总结  我们设计的城市地铁导航系统旨在帮助用户方便快捷地查找和选择地铁线路及站点,并提供实时更新的地铁运行状态和乘车提示。我们在创建项目时遇到的问题有为降低空间复杂度,因而采用邻接表存储结构。Dijkstra的时间复杂度是O(n2),效率并不高,我通过查阅文献的方式了解到可以进一步采用优先队列的思路优化它,在存储时就按照从小到大的顺序实现,这样在选择节点时直接取队首距离最小的节点即可,可以将时间复杂度优化到O(logn)左右 \ No newline at end of file From 1c37f172bad4a65bf6ed6bf1b259f75794333d92 Mon Sep 17 00:00:00 2001 From: ps2zk5fnt <3496841962@qq.com> Date: Mon, 3 Jul 2023 20:07:48 +0800 Subject: [PATCH 12/12] Update README.md --- README.md | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 29a10eb..14609af 100644 --- a/README.md +++ b/README.md @@ -3,15 +3,9 @@ 摘要:本项目针对城市地铁导航系统问题,可实现的功能有: 1、输出所有地点及其介绍 2、查询某一个地点及其介绍 -3、增加一个地点 -4、删除一个地点 -5、更新一个地点 -6、增加一条路 -7、删除一条路 -8、更新一条路 -9、查询某一地点到其他所有地点的最短路径 -10、查询某两个地点之间的最短路径 -11、输出地图 +3、查询某一地点到其他所有地点的最短路径 +4、查询某两个地点之间的最短路径 + *为有效地存储和处理数据,我们采用了图结构的数据结构。具体来说,我们使用邻接表存储每个站点及其相邻站点的信息,并使用哈希表存储站点名称和编号的映射关系。 *为了找出两点间最短路径,采用了Dijkstra算法,算法效率较高。 *项目的效果从整体来看运行流畅,可以为市民提供方便、快捷的地铁路线查询和导航服务。