最短路径问题通常指的是在图中找到两个顶点之间的最短路径。在C语言中,我们可以使用Dijkstra算法或Bellman-Ford算法来解决这个问题。下面我将提供一个使用Dijkstra算法的简单示例,该算法适用于非负权重的图。
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MAX_VERTICES 100
typedef struct {
int n; // 顶点数量
int adjMatrix[MAX_VERTICES][MAX_VERTICES]; // 邻接矩阵
} Graph;
void dijkstra(Graph* graph, int start, int end) {
int dist[MAX_VERTICES]; // 存储从起点到各顶点的距离
int visited[MAX_VERTICES]; // 标记顶点是否被访问过
int i, j, min, min_index;
// 初始化距离数组和访问数组
for (i = 0; i < graph->n; i++) {
dist[i] = INT_MAX;
visited[i] = 0;
}
// 起点到起点的距离为0
dist[start] = 0;
// 遍历所有顶点
for (i = 0; i < graph->n - 1; i++) {
// 找到未访问的顶点中距离最小的顶点
min = INT_MAX;
for (j = 0; j < graph->n; j++) {
if (!visited[j] && dist[j] < min) {
min = dist[j];
min_index = j;
}
}
// 标记找到的顶点为已访问
visited[min_index] = 1;
// 更新相邻顶点的距离
for (j = 0; j < graph->n; j++) {
if (!visited[j] && graph->adjMatrix[min_index][j] != 0 && dist[min_index] != INT_MAX && dist[min_index] + graph->adjMatrix[min_index][j] < dist[j]) {
dist[j] = dist[min_index] + graph->adjMatrix[min_index][j];
}
}
}
// 打印最短路径
printf("最短路径长度为: %d\n", dist[end]);
}
int main() {
Graph graph = {7, {{0, 1, 0, 0, 0, 0, 0},
{1, 0, 1, 1, 0, 0, 0},
{0, 1, 0, 1, 1, 0, 0},
{0, 1, 1, 0, 1, 1, 0},
{0, 0, 1, 1, 0, 1, 1},
{0, 0, 0, 1, 1, 0, 1},
{0, 0, 0, 0, 1, 1, 0}}};
dijkstra(&graph, 0, 6); // 从顶点0到顶点6的最短路径
return 0;
}
我们定义了一个图的结构体`Graph`,其中包含一个邻接矩阵`adjMatrix`来表示图中顶点之间的连接关系。`dijkstra`函数实现了Dijkstra算法,用于计算从起点`start`到终点`end`的最短路径长度。
请注意,这个例子假设图中没有负权重的边。如果图中有负权重的边,那么Dijkstra算法将不适用,而应该使用Bellman-Ford算法。
这个程序将输出从顶点0到顶点6的最短路径长度。