C++实现的最短路径问题

最短路径问题

最短路径问题是图论中的一个经典问题,旨在寻找从一个起点到一个终点的最短路径。最常见的算法包括Dijkstra算法、Bellman-Ford算法和Floyd-Warshall算法。这些算法被广泛用于导航系统、网络路由等领域。

问题描述

  1. 输入: 一个加权图,表示图中各节点之间的连接和权重,以及一个起始节点。
  2. 输出: 从起始节点到其他所有节点的最短路径长度。

代码实现

#include <iostream>
#include <vector>
#include <queue>
#include <climits>

using namespace std;

class ShortestPath {
public:
    // Dijkstra算法实现(适用于非负权重图)
    vector<int> dijkstra(int n, vector<vector<pair<int, int>>> &graph, int start) {
        vector<int> dist(n, INT_MAX);
        dist[start] = 0;
        priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
        pq.push({0, start});

        while (!pq.empty()) {
            int u = pq.top().second;
            int d = pq.top().first;
            pq.pop();

            if (d > dist[u]) continue;

            for (auto &edge : graph[u]) {
                int v = edge.first;
                int weight = edge.second;

                if (dist[u] + weight < dist[v]) {
                    dist[v] = dist[u] + weight;
                    pq.push({dist[v], v});
                }
            }
        }

        return dist;
    }

    // Bellman-Ford算法实现(适用于有负权重的图)
    vector<int> bellmanFord(int n, vector<vector<pair<int, int>>> &graph, int start) {
        vector<int> dist(n, INT_MAX);
        dist[start] = 0;

        for (int i = 1; i < n; i++) {
            for (int u = 0; u < n; u++) {
                for (auto &edge : graph[u]) {
                    int v = edge.first;
                    int weight = edge.second;
                    if (dist[u] != INT_MAX && dist[u] + weight < dist[v]) {
                        dist[v] = dist[u] + weight;
                    }
                }
            }
        }

        // 检查是否存在负权重环
        for (int u = 0; u < n; u++) {
            for (auto &edge : graph[u]) {
                int v = edge.first;
                int weight = edge.second;
                if (dist[u] != INT_MAX && dist[u] + weight < dist[v]) {
                    cout << "Graph contains a negative-weight cycle" << endl;
                    return {};
                }
            }
        }

        return dist;
    }
};

int main() {
    int n, m, start;
    cout << "Enter the number of vertices: ";
    cin >> n;

思路分析

类的设计

ShortestPath类封装了求解最短路径问题的两种常见算法:Dijkstra算法和Bellman-Ford算法。
这种设计使得两种算法可以独立实现和测试,并根据不同的图特性选择合适的算法。

Dijkstra算法

dijkstra()方法使用优先队列(最小堆)来高效地选择当前距离最短的节点,并更新其邻接节点的最短距离。
这种方法适用于没有负权重的图,时间复杂度为O(E log V),其中E为边的数量,V为顶点的数量。

Bellman-Ford算法

bellmanFord()方法适用于含有负权重的图,并且可以检测负权重环的存在。
算法的时间复杂度为O(V * E),在图的稠密度较高时效率较低,但在处理负权重时有其优势。

  • 12
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实现最短路径校园地图,首先需要建立一个校园地图的数据结构。可以使用图的数据结构来表示校园地图,每个节点表示校园中的一个地点,边表示地点之间的路径。然后,可以使用Dijkstra算法或者A*算法来计算最短路径。 首先,需要将校园地图表示成一个邻接矩阵或邻接表的数据结构。矩阵中的每个元素表示两个地点之间的路径长度或者权重,如果两个地点之间没有直接路径,则将相应位置的值设置为无穷大。 接下来,可以选择Dijkstra算法或A*算法来计算最短路径。Dijkstra算法是一个贪心算法,从出发点开始,选择当前距离最短的节点,并更新该节点周围所有邻居的距离。重复这个过程,直到到达目标节点,得到最短路径。A*算法相比于Dijkstra算法更高效,它在选择下一个节点时考虑了节点的预计距离和当前距离的权重,从而更快地找到最短路径。 最后,可以将计算出的最短路径显示在校园地图上,方便用户查看。可以使用图形化界面来展示地图和路径,或者在命令行中输出路径的地点序列。同时,还可以为用户提供其他功能,比如搜索特定地点之间的最短路径、查看校园地图上的景点等。 综上所述,实现最短路径校园地图需要建立合适的数据结构表示校园地图,选择适当的算法计算最短路径,并提供友好的界面给用户使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PeterClerk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值