用c语言构建有向带权图的邻接矩阵存储结构,使用狄克斯特拉算法求起始点到其余各点的最短路径。请给出完整代码
时间: 2024-02-20 17:57:05 浏览: 80
狄克斯特拉算法
好的,以下是完整的 C 代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MAX_VERTICES 100
#define INF INT_MAX
typedef struct GraphType {
int n; // 정점의 개수
int weight[MAX_VERTICES][MAX_VERTICES]; // 간선의 가중치
} GraphType;
int distance[MAX_VERTICES]; // 시작점으로부터의 최단거리
int found[MAX_VERTICES]; // 방문한 정점 표시
int choose(int distance[], int n, int found[]) {
int i, min, minpos;
min = INF;
minpos = -1;
for (i = 0; i < n; i++) {
if (distance[i] < min && !found[i]) {
min = distance[i];
minpos = i;
}
}
return minpos;
}
void shortest_path(GraphType* g, int start) {
int i, u, w;
for (i = 0; i < g->n; i++) {
distance[i] = g->weight[start][i];
found[i] = 0;
}
found[start] = 1;
distance[start] = 0;
for (i = 0; i < g->n - 1; i++) {
u = choose(distance, g->n, found);
found[u] = 1;
for (w = 0; w < g->n; w++) {
if (!found[w]) {
if (distance[u] + g->weight[u][w] < distance[w]) {
distance[w] = distance[u] + g->weight[u][w];
}
}
}
}
}
int main(void) {
GraphType g = { 7,
{{ 0, 7, INF, INF, 3, 10, INF },
{ 7, 0, 4, 10, 2, 6, INF },
{INF, 4, 0, 2, INF, INF, INF },
{INF, 10, 2, 0, 11, 9, 4 },
{ 3, 2, INF, 11, 0, INF, INF },
{10, 6, INF, 9, INF, 0, INF },
{INF, INF, INF, 4, INF, INF, 0 } }
};
shortest_path(&g, 0);
for (int i = 0; i < g.n; i++) {
printf("0에서 %d까지의 최단거리: %d\n", i, distance[i]);
}
return 0;
}
```
这段代码实现了带权有向图的邻接矩阵存储结构和 Dijkstra 算法,可以计算起始点到其余各点的最短路径。
阅读全文