求实现校园最短路径c/c++实现代码

有没有大神有实现求校园最短路径的算法代码,用c或者c++实现最好,自己直接上手编实在做不来,求助啦谢谢

该回答引用ChatGPT-3.5,仅供参考,不保证完全正确

当涉及到校园最短路径问题时,常见的算法是Dijkstra算法或者A*算法。这些算法可以用来找到从一个点到另一个点的最短路径。以下是一个使用Dijkstra算法的C++代码示例:

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

using namespace std;

#define INF INT_MAX

// 图的邻接表表示
typedef pair<int, int> pii;
typedef vector<vector<pii>> Graph;

// Dijkstra算法求解最短路径
vector<int> Dijkstra(const Graph& graph, int source) {
    int n = graph.size();
    vector<int> dist(n, INF); // 到每个节点的最短距离
    vector<bool> visited(n, false); // 标记节点是否已被访问

    dist[source] = 0; // 设置源节点到自身的距离为0

    // 优先队列,根据距离从小到大排序
    priority_queue<pii, vector<pii>, greater<pii>> pq;
    pq.push({0, source});

    while (!pq.empty()) {
        int u = pq.top().second; // 取出距离最小的节点
        pq.pop();

        if (visited[u]) {
            continue;
        }

        visited[u] = true;

        // 遍历u的邻居节点
        for (const auto& neighbor : graph[u]) {
            int v = neighbor.first;
            int weight = neighbor.second;

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

    return dist;
}

int main() {
    int n, m;
    cin >> n >> m; // 输入节点数量和边数量

    Graph graph(n); // 创建一个空图

    // 输入边的信息
    for (int i = 0; i < m; i++) {
        int u, v, w;
        cin >> u >> v >> w; // 输入边的起点、终点和权重

        graph[u].push_back({v, w});
        graph[v].push_back({u, w});
    }

    int source, destination;
    cin >> source >> destination; // 输入起点和终点

    vector<int> shortestDistances = Dijkstra(graph, source); // 调用Dijkstra算法求解最短路径

    int shortestDistance = shortestDistances[destination];
    if (shortestDistance == INF) {
        cout << "No path found!" << endl;
    } else {
        cout << "Shortest distance from " << source << " to " << destination << " is " << shortestDistance << endl;
    }

    return 0;
}

在上述代码中,我们首先使用邻接表表示图,然后实现了Dijkstra算法来计算最短路径。最后,我们从输入中获取起点和终点,并输出最短路径的长度。请注意,该代码假设输入是有效的,并且源节点和目标节点的编号从0开始。你可以根据实际情况进行适当的修改。