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