求邻接矩阵指定两点位置间的最短路径C语言代码,并给出代码解释
时间: 2024-03-26 17:40:34 浏览: 103
改算法可以求任意两点之间的最短距离,只要修改里面的邻接矩阵即可.zip
以下是求邻接矩阵指定两点位置间的最短路径的 C 语言代码,基于 Dijkstra 算法:
```
#include <stdio.h>
#include <stdbool.h>
#define MAX_NODES 100
#define INF 99999
int graph[MAX_NODES][MAX_NODES]; // 邻接矩阵
int dist[MAX_NODES]; // 记录起点到各点的最短距离
bool visited[MAX_NODES]; // 记录各点是否已被访问
// 求起点到终点的最短路径
int dijkstra(int start, int end, int num_nodes) {
// 初始化
for (int i = 0; i < num_nodes; i++) {
dist[i] = INF;
visited[i] = false;
}
dist[start] = 0;
// 循环 n-1 次
for (int i = 0; i < num_nodes - 1; i++) {
int u = -1;
// 找到未访问过的距离起点最近的点
for (int j = 0; j < num_nodes; j++) {
if (!visited[j] && (u == -1 || dist[j] < dist[u])) {
u = j;
}
}
visited[u] = true;
// 更新 u 的邻居的最短距离
for (int v = 0; v < num_nodes; v++) {
if (graph[u][v] != 0) {
int new_dist = dist[u] + graph[u][v];
if (new_dist < dist[v]) {
dist[v] = new_dist;
}
}
}
}
// 返回起点到终点的最短距离
return dist[end];
}
int main() {
int num_nodes, num_edges, start, end;
// 输入节点数、边数、起点、终点
scanf("%d %d %d %d", &num_nodes, &num_edges, &start, &end);
// 初始化邻接矩阵
for (int i = 0; i < num_nodes; i++) {
for (int j = 0; j < num_nodes; j++) {
graph[i][j] = 0;
}
}
// 输入边的信息
for (int i = 0; i < num_edges; i++) {
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
graph[u][v] = w;
}
// 求起点到终点的最短路径
int shortest_dist = dijkstra(start, end, num_nodes);
// 输出最短距离
printf("%d\n", shortest_dist);
return 0;
}
```
代码解释:
首先定义了邻接矩阵 `graph`、记录起点到各点的最短距离的数组 `dist` 和记录各点是否已被访问的数组 `visited`。
`dijkstra` 函数实现了 Dijkstra 算法,接受起点、终点和节点数作为参数,返回起点到终点的最短距离。在函数中,首先进行初始化,将起点的最短距离设为 0,其他节点的最短距离设为无穷大。然后循环 n-1 次,每次找到未访问过的距离起点最近的点 u,将 u 标记为已访问,然后更新 u 的邻居的最短距离。最后返回起点到终点的最短距离。
`main` 函数中输入节点数、边数、起点和终点,然后初始化邻接矩阵,输入边的信息,调用 `dijkstra` 函数求起点到终点的最短路径,并输出最短距离。
阅读全文