简介:本文将详细介绍Dijkstra算法的原理,并通过C++代码实现该算法,从而在有向图中找到最短路径。Dijkstra算法是一种贪心算法,它能在加权图中找到从源点到其他所有顶点的最短路径。
在计算机科学中,Dijkstra算法是一种用于解决带权有向图中单源最短路径问题的贪心算法。这种算法由荷兰计算机科学家艾兹格·迪杰斯特拉于1956年发明,它使用广度优先搜索策略来解决问题。
Dijkstra算法的基本思想是:从源点开始,逐步向外层扩展,直到找到从源点到所有其他顶点的最短路径。
算法步骤:
以下是使用C++实现Dijkstra算法的示例代码。假设图以邻接矩阵的形式表示,其中graph[i][j]表示从顶点i到顶点j的边的权重,如果i和j之间没有边,则graph[i][j]为无穷大。
```cpp
using namespace std;
const int INF = numeric_limits
void dijkstra(const vector
int numVertices = graph.size();
vector
for (int i = 0; i < numVertices; ++i) {dist[i] = INF;}dist[source] = 0;for (int i = 0; i < numVertices - 1; ++i) {int u = -1;int minDist = INF;for (int j = 0; j < numVertices; ++j) {if (!visited[j] && dist[j] <= minDist) {u = j;minDist = dist[j];}}visited[u] = true;for (int v = 0; v < numVertices; ++v) {if (!visited[v] && graph[u][v] && dist[u] != INF && dist[u] + graph[u][v] < dist[v]) {dist[v] = dist[u] + graph[u][v];}}}
}
int main() {
vector
{0, 4, 0, 0, 0, 0, 0, 8, 0},
{4, 0, 8, 0, 0, 0, 0, 11, 0},
{0, 8, 0, 7, 0, 4, 0, 0, 2},
{0, 0, 7, 0, 9, 14, 0, 0, 0},
{0, 0, 0, 9, 0, 10, 0, 0, 0},
{0, 0, 4, 14, 10, 0, 2, 0, 0},
{0, 0, 0, 0, 0, 2, 0, 1, 6},
{8, 11, 0, 0, 0, 0, 1, 0, 7},
{0, 0, 2, 0, 0, 0, 6, 7, 0}
};
int source = 0;