MST

星途 面试题库

面试题:C++ 中 Dijkstra 算法的基本实现

请使用 C++ 实现一个简单的 Dijkstra 算法,用于计算加权有向图中从给定起始顶点到其他所有顶点的最短路径。假设图的邻接表表示已经给出,你需要完成核心的 Dijkstra 算法逻辑部分。
45.4万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>
#include <vector>
#include <queue>
#include <limits>

using namespace std;

// 定义图的边
struct Edge {
    int to;
    int weight;
    Edge(int t, int w) : to(t), weight(w) {}
};

// 定义图
using Graph = vector<vector<Edge>>;

// Dijkstra 算法
vector<int> dijkstra(const Graph& graph, int start) {
    int n = graph.size();
    vector<int> dist(n, numeric_limits<int>::max());
    vector<bool> visited(n, false);
    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;
        pq.pop();

        if (visited[u]) continue;
        visited[u] = true;

        for (const Edge& edge : graph[u]) {
            int v = edge.to;
            int weight = edge.weight;
            if (!visited[v] && dist[u] + weight < dist[v]) {
                dist[v] = dist[u] + weight;
                pq.push({dist[v], v});
            }
        }
    }

    return dist;
}

你可以使用以下方式调用这个函数:

int main() {
    // 示例图的邻接表
    Graph graph = {
        {{1, 4}, {2, 1}},
        {{2, 3}, {3, 2}, {4, 6}},
        {{1, 2}, {3, 5}, {4, 8}},
        {{4, 4}},
        {}
    };

    int start = 0;
    vector<int> distances = dijkstra(graph, start);

    for (size_t i = 0; i < distances.size(); ++i) {
        cout << "从顶点 " << start << " 到顶点 " << i << " 的最短距离是: " << distances[i] << endl;
    }

    return 0;
}

代码说明

  1. Edge 结构体:表示图的一条边,包含目标顶点 to 和权重 weight
  2. Graph 类型别名:使用 vector<vector<Edge>> 表示图的邻接表。
  3. dijkstra 函数:实现 Dijkstra 算法核心逻辑。
    • dist 数组:存储从起始顶点到其他各顶点的最短距离,初始化为无穷大。
    • visited 数组:标记顶点是否已访问。
    • pq 优先队列:存储顶点及其到起始顶点的距离,按距离从小到大排序。
    • 在循环中,每次取出距离最小且未访问的顶点,更新其邻接顶点的距离,并将其加入优先队列。
  4. main 函数:构建一个示例图,并调用 dijkstra 函数计算从起始顶点到其他顶点的最短距离,并输出结果。