用c语言写一个求解无向图遍历完所有点走过的最短路径问题
时间: 2024-03-25 11:37:13 浏览: 54
用C写的一个最短路径算法
好的,这是一个经典的图论问题,可以使用 Dijkstra 算法来解决。下面是使用 C 语言实现 Dijkstra 算法求解无向图遍历完所有点走过的最短路径的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MAX_VERTICES 100
#define INF INT_MAX
typedef struct Graph {
int V; // 顶点数
int E; // 边数
int adj[MAX_VERTICES][MAX_VERTICES]; // 邻接矩阵
} Graph;
void init_graph(Graph* G, int V) {
G->V = V;
G->E = 0;
for (int i = 0; i < G->V; i++) {
for (int j = 0; j < G->V; j++) {
G->adj[i][j] = INF;
}
}
}
void add_edge(Graph* G, int u, int v, int w) {
G->adj[u][v] = w;
G->adj[v][u] = w;
G->E++;
}
void dijkstra(Graph* G, int s, int dist[]) {
int visited[MAX_VERTICES] = {0};
for (int i = 0; i < G->V; i++) {
dist[i] = INF;
}
dist[s] = 0;
for (int i = 0; i < G->V; i++) {
int u = -1;
for (int j = 0; j < G->V; j++) {
if (!visited[j] && (u == -1 || dist[j] < dist[u])) {
u = j;
}
}
visited[u] = 1;
for (int v = 0; v < G->V; v++) {
if (G->adj[u][v] != INF) {
if (dist[u] + G->adj[u][v] < dist[v]) {
dist[v] = dist[u] + G->adj[u][v];
}
}
}
}
}
int main() {
Graph G;
int V = 6;
init_graph(&G, V);
add_edge(&G, 0, 1, 10);
add_edge(&G, 0, 2, 3);
add_edge(&G, 1, 2, 1);
add_edge(&G, 1, 3, 2);
add_edge(&G, 2, 1, 4);
add_edge(&G, 2, 3, 8);
add_edge(&G, 2, 4, 2);
add_edge(&G, 3, 4, 7);
add_edge(&G, 3, 5, 1);
add_edge(&G, 4, 5, 5);
int dist[MAX_VERTICES];
dijkstra(&G, 0, dist);
printf("最短路径长度为:%d\n", dist[V - 1]);
return 0;
}
```
这个示例代码中,我们使用了邻接矩阵来表示图,并用 Dijkstra 算法求出了从起点 0 到终点 5 的最短路径长度。
阅读全文