非整数类型C语言迪杰斯特拉算法输出最短路径
时间: 2023-08-31 11:27:11 浏览: 99
迪杰斯特拉算法求最短路径
5星 · 资源好评率100%
在 C 语言中,可以使用浮点数来表示非整数类型的路径长度,并且同样可以使用迪杰斯特拉算法来求解最短路径。具体实现可以参考以下代码:
```c
#include <stdio.h>
#include <limits.h>
#define V 5 // 图的顶点数
#define INF INT_MAX // 表示无穷大
// 函数:迪杰斯特拉算法求解最短路径
void dijkstra(float graph[V][V], int src)
{
float dist[V]; // 存储源点到每个顶点的最短距离
int visited[V] = {0}; // 标记每个顶点是否已被访问
// 初始化
for (int i = 0; i < V; i++) {
dist[i] = INF;
}
dist[src] = 0;
// 按照最短距离依次访问每个顶点
for (int count = 0; count < V - 1; count++) {
// 找到当前未访问过的距离源点最近的顶点
float minDist = INF;
int minIndex = -1;
for (int i = 0; i < V; i++) {
if (!visited[i] && dist[i] < minDist) {
minDist = dist[i];
minIndex = i;
}
}
// 标记该顶点已被访问
visited[minIndex] = 1;
// 更新与该顶点相邻的顶点的最短距离
for (int i = 0; i < V; i++) {
if (!visited[i] && graph[minIndex][i] != 0 && dist[minIndex] != INF
&& dist[minIndex] + graph[minIndex][i] < dist[i]) {
dist[i] = dist[minIndex] + graph[minIndex][i];
}
}
}
// 输出结果
printf("最短距离:\n");
for (int i = 0; i < V; i++) {
if (dist[i] == INF) {
printf("%d 到 %d 不存在路径\n", src, i);
} else {
printf("%d 到 %d 的最短距离为 %.2f\n", src, i, dist[i]);
}
}
}
// 主函数
int main()
{
// 用邻接矩阵表示图
float graph[V][V] = {
{0, 2.5, 0, 1.2, 3.4},
{2.5, 0, 1.1, 0, 0},
{0, 1.1, 0, 0, 2.2},
{1.2, 0, 0, 0, 1.7},
{3.4, 0, 2.2, 1.7, 0}
};
dijkstra(graph, 0); // 从顶点0开始求解最短路径
return 0;
}
```
需要注意的是,由于浮点数的精度问题,可能会存在一些误差。因此,在比较两个浮点数是否相等时,应该容忍一定的误差,例如:
```c
if (fabs(a - b) < 1e-6) {
// a 和 b 可以认为相等
}
```
阅读全文