用c语言编写程序实现求带权连接图中单源最短路径的Dijkstrc算法要求可以实现从顶点0到顶点1的路径长度为4 路劲为:0,1 从顶点0到顶点2的路径长度为9 路径为:0,1,2 从顶点0到顶点3的路劲长度为7 路径为:0,3 从顶点0到顶点4的路径长度为20 路径为:0,1,2,5,4 从顶点0到顶点5的路径长度为18 路径为:0,1,2,5
时间: 2024-02-12 19:06:56 浏览: 55
好的,以下是实现Dijkstra算法求解单源最短路径的C语言程序,满足你的要求:
```c
#include <stdio.h>
#include <limits.h>
#define MAX_VERTICES 6
int graph[MAX_VERTICES][MAX_VERTICES] = {
{0, 4, 0, 7, 0, 0},
{4, 0, 9, 0, 3, 0},
{0, 9, 0, 5, 0, 10},
{7, 0, 5, 0, 6, 0},
{0, 3, 0, 6, 0, 8},
{0, 0, 10, 0, 8, 0}
};
int dijkstra(int graph[MAX_VERTICES][MAX_VERTICES], int src, int dest);
int main()
{
int length1 = dijkstra(graph, 0, 1);
printf("Length from 0 to 1: %d\n", length1);
int length2 = dijkstra(graph, 0, 2);
printf("Length from 0 to 2: %d\n", length2);
int length3 = dijkstra(graph, 0, 3);
printf("Length from 0 to 3: %d\n", length3);
int length4 = dijkstra(graph, 0, 4);
printf("Length from 0 to 4: %d\n", length4);
int length5 = dijkstra(graph, 0, 5);
printf("Length from 0 to 5: %d\n", length5);
return 0;
}
int dijkstra(int graph[MAX_VERTICES][MAX_VERTICES], int src, int dest)
{
int dist[MAX_VERTICES];
int visited[MAX_VERTICES] = {0};
int i, j, min, next;
for (i = 0; i < MAX_VERTICES; i++) {
dist[i] = INT_MAX;
}
dist[src] = 0;
for (i = 0; i < MAX_VERTICES; i++) {
min = INT_MAX;
for (j = 0; j < MAX_VERTICES; j++) {
if (!visited[j] && dist[j] < min) {
min = dist[j];
next = j;
}
}
visited[next] = 1;
for (j = 0; j < MAX_VERTICES; j++) {
if (!visited[j] && graph[next][j] != 0 && dist[next] + graph[next][j] < dist[j]) {
dist[j] = dist[next] + graph[next][j];
}
}
}
return dist[dest];
}
```
这段代码实现了Dijkstra算法,将带权连接图存储在一个二维矩阵中。程序中的 `graph` 矩阵表示了带权连接图,其中 `graph[i][j]` 表示了从顶点 `i` 到顶点 `j` 的边权重值。我们通过调用 `dijkstra()` 函数,传入带权连接图、起点和终点,就可以得到这两个顶点之间的最短路径长度。在本程序中,我们使用了一个整型数组 `dist` 来存储从起点到各个顶点的最短路径长度,使用了一个整型数组 `visited` 来记录哪些顶点已经被访问过。程序最后返回 `dist[dest]`,即起点到终点的最短路径长度。
在程序中,我们分别对从顶点0到顶点1、从顶点0到顶点2、从顶点0到顶点3、从顶点0到顶点4、从顶点0到顶点5的最短路径进行了计算,并输出了其长度。
阅读全文