|
|
@ -120,6 +120,78 @@ head -> O |weight=2| -> 1 |weight=5| -> null
|
|
|
|
我们选择Dijkstra算法作为路径计算模块的核心算法。Dijkstra算法是一种广泛应用于最短路径问题上的算法,具有速度快、结果正确性高、易于实现等优势。它通过不断更新起点到每个点的最短距离,并使用优先队列维护每个点的最短距离,直到计算出终点的最短路径。
|
|
|
|
我们选择Dijkstra算法作为路径计算模块的核心算法。Dijkstra算法是一种广泛应用于最短路径问题上的算法,具有速度快、结果正确性高、易于实现等优势。它通过不断更新起点到每个点的最短距离,并使用优先队列维护每个点的最短距离,直到计算出终点的最短路径。
|
|
|
|
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<Node> shortestPath(Node from, Node to);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
|
|
// 存储节点和边的数据结构
|
|
|
|
|
|
|
|
vector<Node> nodes_;
|
|
|
|
|
|
|
|
vector<vector<pair<int, int>>> adjacencyList_;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 计算从起点到终点的最短路径
|
|
|
|
|
|
|
|
vector<int> 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. 系统测试
|
|
|
|
4. 系统测试
|
|
|
|
系统测试思路和方法:
|
|
|
|
系统测试思路和方法:
|
|
|
|
|
|
|
|
|
|
|
|