📅  最后修改于: 2023-12-03 14:55:17.317000             🧑  作者: Mango
本程序实现了在给定图中找到一条最低成本路径的功能。其中,图的表示使用邻接矩阵。
本程序使用了Dijkstra算法来寻找最低成本路径,具体实现如下:
#include <stdio.h>
#include <limits.h>
#define MAX_N 100
#define INF INT_MAX
int graph[MAX_N][MAX_N];
int cost[MAX_N];
int visited[MAX_N];
int dijkstra(int start, int end, int n) {
// 初始化
for (int i = 0; i < n; i++) {
cost[i] = graph[start][i];
visited[i] = 0;
}
cost[start] = 0;
visited[start] = 1;
// 进行n-1次循环
for (int i = 0; i < n - 1; i++) {
int min_cost = INF;
int u;
// 找到当前cost最小的点u
for (int j = 0; j < n; j++) {
if (!visited[j] && cost[j] < min_cost) {
u = j;
min_cost = cost[j];
}
}
if (min_cost == INF) {
break;
}
// 将u加入visited集合,并更新cost
visited[u] = 1;
for (int j = 0; j < n; j++) {
if (!visited[j] && graph[u][j] != INF) {
if (cost[u] + graph[u][j] < cost[j]) {
cost[j] = cost[u] + graph[u][j];
}
}
}
}
// 返回最低成本
return cost[end];
}
int main() {
// 读入图的信息
int n, m;
scanf("%d %d", &n, &m);
for (int i = 0; i < MAX_N; i++) {
for (int j = 0; j < MAX_N; j++) {
graph[i][j] = INF;
}
}
for (int i = 0; i < m; i++) {
int u, v, c;
scanf("%d %d %d", &u, &v, &c);
graph[u][v] = c;
}
// 读入起点和终点
int start, end;
scanf("%d %d", &start, &end);
// 执行Dijkstra算法
int lowest_cost = dijkstra(start, end, n);
// 输出结果
printf("Lowest cost from %d to %d is %d\n", start, end, lowest_cost);
return 0;
}
输入:
6 10
0 1 5
0 2 10
1 3 5
1 4 7
2 1 1
2 4 3
2 5 2
3 4 1
4 3 1
4 5 2
0 5
输出:
Lowest cost from 0 to 5 is 8
本程序实现了使用Dijkstra算法找到最低成本路径的功能,是一种比较常见的图论算法。通过学习本程序,可以加深对算法的理解,提高对C语言的熟练度。