用c语言写迪杰斯特拉算法完整代码
时间: 2023-10-11 13:11:41 浏览: 102
迪杰斯特拉算法
好的,下面是一个使用C语言实现的迪杰斯特拉(Dijkstra)算法的完整代码:
```c
#include <stdio.h>
#include <stdbool.h>
#include <limits.h>
#define MAX_VERTICES 100
int graph[MAX_VERTICES][MAX_VERTICES]; // 图的邻接矩阵表示
int distance[MAX_VERTICES]; // 保存最短路径的距离
bool visited[MAX_VERTICES]; // 标记节点是否被访问
int numVertices; // 图中的顶点数
// 初始化图
void initGraph() {
int i, j;
for (i = 0; i < MAX_VERTICES; i++) {
for (j = 0; j < MAX_VERTICES; j++) {
graph[i][j] = 0;
}
distance[i] = INT_MAX; // 初始化距离为无穷大
visited[i] = false; // 标记未访问
}
}
// 添加边到图中
void addEdge(int start, int end, int weight) {
graph[start][end] = weight;
graph[end][start] = weight;
}
// 找到距离最小的节点
int findMinDistance() {
int minDistance = INT_MAX;
int minVertex = -1;
int i;
for (i = 0; i < numVertices; i++) {
if (!visited[i] && distance[i] < minDistance) {
minDistance = distance[i];
minVertex = i;
}
}
return minVertex;
}
// 打印最短路径
void printShortestPath(int startVertex) {
int i;
printf("最短路径:\n");
for (i = 0; i < numVertices; i++) {
printf("从节点 %d 到节点 %d 的最短距离为 %d\n", startVertex, i, distance[i]);
}
}
// 迪杰斯特拉算法
void dijkstra(int startVertex) {
int i, j;
distance[startVertex] = 0;
for (i = 0; i < numVertices; i++) {
int minVertex = findMinDistance();
visited[minVertex] = true;
for (j = 0; j < numVertices; j++) {
if (!visited[j] && graph[minVertex][j] != 0 && distance[minVertex] != INT_MAX
&& distance[minVertex] + graph[minVertex][j] < distance[j]) {
distance[j] = distance[minVertex] + graph[minVertex][j];
}
}
}
printShortestPath(startVertex);
}
int main() {
int i, j;
int numEdges, startVertex;
printf("请输入图中的顶点数:");
scanf("%d", &numVertices);
printf("请输入图中的边数:");
scanf("%d", &numEdges);
initGraph();
printf("请输入每条边的起始顶点、结束顶点和权重:\n");
for (i = 0; i < numEdges; i++) {
int start, end, weight;
scanf("%d %d %d", &start, &end, &weight);
addEdge(start, end, weight);
}
printf("请输入起始顶点:");
scanf("%d", &startVertex);
dijkstra(startVertex);
return 0;
}
```
在这段代码中,我们使用邻接矩阵表示图,并实现了迪杰斯特拉算法来找到起始顶点到其他顶点的最短路径。你可以根据需要修改和扩展代码。希望对你有帮助!
阅读全文