迪杰斯特拉(Dijkstra)算法(C/C++)
以下是使用C/C++实现迪杰斯特拉(Dijkstra)算法的一个基本示例。这个示例假设图是以邻接矩阵的形式给出,并且使用了一个简单的邻接矩阵来表示图。
#include <stdio.h>
#include <limits.h>
#define V 5 // 图中顶点的数目
#define INF 0x3f3f3f3f // 用于表示无限大
int minDistance(int dist[], bool sptSet[]) {
int min = INT_MAX, min_index;
for (int v = 0; v < V; v++)
if (sptSet[v] == false && dist[v] <= min)
min = dist[v], min_index = v;
return min_index;
}
void dijkstra(int graph[V][V], int src) {
int dist[V];
bool sptSet[V];
for (int i = 0; i < V; i++) {
dist[i] = INT_MAX;
sptSet[i] = false;
}
dist[src] = 0;
for (int count = 0; count < V - 1; count++) {
int u = minDistance(dist, sptSet);
sptSet[u] = true;
for (int v = 0; v < V; v++)
if (!sptSet[v] && graph[u][v] && (dist[v] > dist[u] + graph[u][v]))
dist[v] = dist[u] + graph[u][v];
}
for (int i = 0; i < V; i++)
(i == V - 1) ? printf("%d\n", dist[i]) : printf("%d ", dist[i]);
}
int main() {
int graph[V][V] = {
{0, 4, 0, 0, 0, 0},
{4, 0, 8, 0, 0, 0},
{0, 8, 0, 11, 0, 0},
{0, 0, 11, 0, 16, 0},
{0, 0, 0, 16, 0, 23},
{0, 0, 0, 0, 23, 0}
};
dijkstra(graph, 0);
return 0;
}
这段代码首先定义了图中顶点的数目V,并使用一个邻接矩阵来表示图。然后,定义了minDistance
函数来找出当前未包含在最短路径树中的顶点,其距离最小。dijkstra
函数实现了Dijkstra算法的主要逻辑,包括初始化、更新最短路径树以及打印结果。最后,在main
函数中,创建了一个邻接矩阵并调用dijkstra
函数来计算从顶点0到其他顶点的最短路径。
评论已关闭