用c语言写一个求解无向图遍历完所有点走过的最短路径问题,并打印出最短路径
时间: 2024-03-25 10:37:34 浏览: 82
好的,我可以为您提供一个基于 Dijkstra 算法的 C 语言程序来解决无向图遍历完所有点走过的最短路径问题。这里假设图是不带权的。
代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MAX_VERTICES 100
#define INFINITY INT_MAX
int graph[MAX_VERTICES][MAX_VERTICES];
int distance[MAX_VERTICES];
int visited[MAX_VERTICES];
int num_vertices;
void dijkstra(int start_vertex) {
int i, j, min_distance, next_vertex;
// 初始化距离为无穷大,visited 为 false
for (i = 0; i < num_vertices; i++) {
distance[i] = INFINITY;
visited[i] = 0;
}
// 设置起始点的距离为 0
distance[start_vertex] = 0;
// 计算最短路径
for (i = 0; i < num_vertices; i++) {
min_distance = INFINITY;
// 找到距离起始点最近的点
for (j = 0; j < num_vertices; j++) {
if (!visited[j] && distance[j] < min_distance) {
min_distance = distance[j];
next_vertex = j;
}
}
// 标记该点为 visited
visited[next_vertex] = 1;
// 更新相邻点的距离
for (j = 0; j < num_vertices; j++) {
if (!visited[j] && graph[next_vertex][j] != 0) {
if (distance[next_vertex] + graph[next_vertex][j] < distance[j]) {
distance[j] = distance[next_vertex] + graph[next_vertex][j];
}
}
}
}
}
int main() {
int i, j, total_distance = 0;
printf("请输入无向图的顶点数:");
scanf("%d", &num_vertices);
printf("请输入无向图的邻接矩阵:\n");
for (i = 0; i < num_vertices; i++) {
for (j = 0; j < num_vertices; j++) {
scanf("%d", &graph[i][j]);
}
}
// 从第一个点开始计算最短路径
dijkstra(0);
// 计算总距离
for (i = 0; i < num_vertices; i++) {
total_distance += distance[i];
}
printf("最短路径为:");
for (i = 0; i < num_vertices; i++) {
printf("%d ", distance[i]);
}
printf("\n");
printf("总距离为:%d\n", total_distance);
return 0;
}
```
在程序中,我们首先输入无向图的顶点数和邻接矩阵,然后调用 dijkstra 函数计算最短路径。最后,我们输出最短路径和总距离。
需要注意的是,这个程序假设图是不带权的,如果需要处理带权图,只需要将邻接矩阵中的 0 替换为相应的边权值即可。
阅读全文