代克斯特拉演(Dijkstra)算法是一个用于找出图中单源最短路径问题的算法。下面是一个使用C语言实现的Dijkstra算法的例子。这个例子假定图是以邻接矩阵的形式表示的,并且图中的边权重是非负的。
#include <stdio.h>
#include <limits.h>#define V 9 // 假设图中有9个顶点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 printSolution(int dist[]) {printf("Vertex Distance from Source\n");for (int i = 0; i < V; i++)printf("%d \t\t %d\n", i, dist[i]);
}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[u] != INT_MAX && dist[u] + graph[u][v] < dist[v])dist[v] = dist[u] + graph[u][v];}printSolution(dist);
}int main() {int graph[V][V] = {{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}};dijkstra(graph, 0);return 0;
}
这个代码首先定义了一个minDistance
函数,用于在未包含在最短路径树中的顶点中找到距离源点最近的顶点。dijkstra
函数是实现Dijkstra算法的主要函数,它使用一个布尔数组sptSet
来跟踪已经包含在最短路径树中的顶点,并使用一个dist
数组来存储从源点到每个顶点的最短距离。在main
函数中,我们定义了一个图的邻接矩阵,并调用dijkstra
函数来找出从顶点0到其他所有顶点的最短路径。
注意:在实际应用中,你可能需要根据具体的图结构和需求对代码进行调整。此外,这个实现假设了图中没有负权重的边。如果你的图中包含负权重的边,你可能需要使用其他算法,如Bellman-Ford算法。