用c语言编码使用邻接矩阵来存储带权有向图G,并编程实现迪杰斯特拉算法。
时间: 2024-01-30 11:04:12 浏览: 132
好的,下面是使用 C 语言编写的邻接矩阵存储带权有向图,并实现迪杰斯特拉算法的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define INF 0x3f3f3f3f // 表示无穷大
// 定义邻接矩阵结构体
typedef struct {
int** matrix; // 存储邻接矩阵的二维数组
int n; // 顶点数
} Graph;
// 创建一个有 n 个顶点的图
Graph createGraph(int n) {
Graph graph;
graph.n = n;
graph.matrix = (int**)malloc(n * sizeof(int*));
for (int i = 0; i < n; i++) {
graph.matrix[i] = (int*)malloc(n * sizeof(int));
for (int j = 0; j < n; j++) {
graph.matrix[i][j] = INF; // 初始化为无穷大
}
}
return graph;
}
// 添加一条从 u 到 v 权值为 w 的边
void addEdge(Graph* graph, int u, int v, int w) {
graph->matrix[u][v] = w;
}
// 找到距离源点最近的顶点
int findMinDistVertex(bool* visited, int* dist, int n) {
int u = -1;
for (int i = 0; i < n; i++) {
if (!visited[i] && (u == -1 || dist[i] < dist[u])) {
u = i;
}
}
return u;
}
// 迪杰斯特拉算法
void dijkstra(Graph graph, int src, int* dist) {
bool visited[graph.n];
for (int i = 0; i < graph.n; i++) {
visited[i] = false;
dist[i] = INF;
}
dist[src] = 0;
for (int i = 0; i < graph.n; i++) {
int u = findMinDistVertex(visited, dist, graph.n);
visited[u] = true;
for (int v = 0; v < graph.n; v++) {
if (graph.matrix[u][v] != INF && !visited[v]) {
int new_dist = dist[u] + graph.matrix[u][v];
if (new_dist < dist[v]) {
dist[v] = new_dist;
}
}
}
}
}
int main() {
int n = 5;
Graph graph = createGraph(n);
addEdge(&graph, 0, 1, 10);
addEdge(&graph, 0, 3, 5);
addEdge(&graph, 1, 2, 1);
addEdge(&graph, 1, 3, 2);
addEdge(&graph, 2, 4, 4);
addEdge(&graph, 3, 1, 3);
addEdge(&graph, 3, 2, 9);
addEdge(&graph, 3, 4, 2);
int src = 0;
int dist[n];
dijkstra(graph, src, dist);
printf("从顶点 %d 到其他顶点的最短距离:\n", src);
for (int i = 0; i < n; i++) {
printf("%d -> %d: %d\n", src, i, dist[i]);
}
return 0;
}
```
上面的代码中,我们先定义了一个邻接矩阵结构体 `Graph`,其中包含一个 `matrix` 成员变量,存储邻接矩阵的二维数组,以及一个 `n` 成员变量,表示顶点数。使用 `createGraph` 函数创建一个有 `n` 个顶点的图,并使用 `addEdge` 函数添加边。
然后,我们实现了一个 `dijkstra` 函数,它接受一个图 `graph`、源点编号 `src` 和一个距离数组 `dist`,并使用迪杰斯特拉算法计算从源点到其他顶点的最短距离。最后,我们在 `main` 函数中创建一个 5 个顶点的图,并使用源点 0 计算最短距离,并输出结果。
希望这个代码对您有帮助!
阅读全文