📜  最低成本路径的C程序(1)

📅  最后修改于: 2023-12-03 14:55:17.317000             🧑  作者: Mango

最低成本路径的C程序

概述

本程序实现了在给定图中找到一条最低成本路径的功能。其中,图的表示使用邻接矩阵。

程序实现

本程序使用了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语言的熟练度。