#include #include #include #define MAX_NODES 5 void dijkstra(int v, float a[MAX_NODES][MAX_NODES], float dist[MAX_NODES], int prev[MAX_NODES]) { int n = MAX_NODES; // 节点总数 if (v < 0 || v >= n) { return; // 如果源节点不在有效范围内,返回 } bool s[MAX_NODES] = {false}; // 标记节点是否已确定最短路径 for (int i = 0; i < n; i++) { // 初始化 dist[i] = a[v][i]; s[i] = false; if (dist[i] == FLT_MAX) { prev[i] = -1; // 如果没有路径,prev 设置为 -1 } else { prev[i] = v; // 否则,前驱节点为源节点 } } dist[v] = 0; // 源节点的距离是0 s[v] = true; // 源节点加入已确定集合 for (int i = 1; i < n; i++) { // Dijkstra 算法主体 float temp = FLT_MAX; int u = v; // 选择未访问的最短路径节点 for (int j = 0; j < n; j++) { if (!s[j] && dist[j] < temp) { u = j; temp = dist[j]; } } s[u] = true; // 确定最短路径节点 u // 更新与节点 u 相邻的节点的最短路径 for (int j = 0; j < n; j++) { if (!s[j] && a[u][j] < FLT_MAX) { float newdist = dist[u] + a[u][j]; if (newdist < dist[j]) { dist[j] = newdist; prev[j] = u; // 更新前驱节点 } } } } } int main() { // 定义图的邻接矩阵 (FLT_MAX 表示没有路径) float a[MAX_NODES][MAX_NODES] = { {0, 8, 1, 2, FLT_MAX}, {8, 0, FLT_MAX, 3, FLT_MAX}, {1, FLT_MAX, 0, 2, 3}, {2, 3, 2, 0, 3}, {FLT_MAX, FLT_MAX, 3, 3, 0} }; float dist[MAX_NODES]; // 存储从源点到各个节点的最短距离 int prev[MAX_NODES]; // 存储每个节点的前驱节点 // 执行 Dijkstra 算法,从节点 0 开始 dijkstra(0, a, dist, prev); // 输出源点到其他节点的最短距离 for (int i = 1; i < MAX_NODES; i++) { if (dist[i] == FLT_MAX) { printf("源点到%d没有路径\n", i); } else { printf("源点到%d的最短距离为:%.2f\n", i, dist[i]); } } return 0; }