单源最短路径贪心算法c语言
时间: 2023-10-26 17:05:07 浏览: 108
用贪心算法解单源最短路径问题.doc
单源最短路径贪心算法有多种,其中比较经典的是Dijkstra算法和Bellman-Ford算法。下面给出Dijkstra算法的C语言实现:
```c
#include <stdio.h>
#include <limits.h>
#define V 6 // 图的顶点数
#define INF INT_MAX // 无穷大
void Dijkstra(int graph[V][V], int src)
{
int dist[V]; // 存储源点到各点的最短距离
int visited[V]; // 标记是否已经找到最短路径
int i, j, min_dist, u;
// 初始化
for (i = 0; i < V; i++) {
dist[i] = INF;
visited[i] = 0;
}
dist[src] = 0;
// 找到V-1个顶点的最短路径
for (i = 0; i < V-1; i++) {
min_dist = INF;
// 找到未访问过的距离源点最近的顶点
for (j = 0; j < V; j++) {
if (!visited[j] && dist[j] < min_dist) {
min_dist = dist[j];
u = j;
}
}
visited[u] = 1;
// 更新u的邻居的距离
for (j = 0; j < V; j++) {
if (!visited[j] && graph[u][j] && dist[u] != INF
&& dist[u]+graph[u][j] < dist[j]) {
dist[j] = dist[u] + graph[u][j];
}
}
}
// 输出最短路径
printf("Vertex Distance from Source\n");
for (i = 0; i < V; i++) {
printf("%d\t%d\n", i, dist[i]);
}
}
int main()
{
int graph[V][V] = { {0, 2, 5, 1, INF, INF},
{2, 0, 3, 2, INF, INF},
{5, 3, 0, 3, 1, 5},
{1, 2, 3, 0, 1, INF},
{INF, INF, 1, 1, 0, 2},
{INF, INF, 5, INF, 2, 0} };
Dijkstra(graph, 0);
return 0;
}
```
这里使用邻接矩阵存储图,如果两个顶点之间没有边,则存储为无穷大(INF)。在Dijkstra算法中,用一个dist数组存储源点到各点的最短距离,用一个visited数组标记是否已经找到最短路径。首先初始化dist数组和visited数组,然后找到未访问过的距离源点最近的顶点u,标记它已经找到最短路径,然后更新u的邻居的距离。重复这个过程V-1次,即可求出源点到其他所有顶点的最短路径。
阅读全文