用c实现diikstra算法

下面是用C语言实现Dijkstra算法的示例代码。Dijkstra算法用于在带权重的图中找到从源点到所有其他顶点的最短路径。这里,我们假设使用邻接矩阵来表示图,并且图中没有负权重的边。

#include <stdio.h>
#include <limits.h>

#define V 9 // 图中顶点的数量

// 寻找最短路径树集合中距离最短的顶点
int minDistance(int dist[], int sptSet[]) {
    int min = INT_MAX, min_index;

    for (int v = 0; v < V; v++)
        if (sptSet[v] == 0 && dist[v] <= min)
            min = dist[v], min_index = v;

    return min_index;
}

// 打印构造的距离数组
void printSolution(int dist[]) {
    printf("Vertex \t\t Distance from Source\n");
    for (int i = 0; i < V; i++)
        printf("%d \t\t %d\n", i, dist[i]);
}

// 使用Dijkstra算法实现函数
void dijkstra(int graph[V][V], int src) {
    int dist[V]; // 输出数组。dist[i]将保存从源到顶点i的最短距离
    int sptSet[V]; // sptSet[i]为真,如果顶点i在最短路径树中,或者最短距离从src到i已经确定

    // 初始化所有距离为无穷大,sptSet[]为假
    for (int i = 0; i < V; i++)
        dist[i] = INT_MAX, sptSet[i] = 0;

    // 源顶点到自身的距离始终为0
    dist[src] = 0;

    // 找到所有顶点的最短路径
    for (int count = 0; count < V - 1; count++) {
        // 选择最短距离顶点的最小距离顶点。u始终等于src在第一次迭代中
        int u = minDistance(dist, sptSet);

        // 标记选定的顶点为已处理
        sptSet[u] = 1;

        // 更新相邻顶点的距离值
        for (int v = 0; v < V; v++)

            // 更新dist[v]仅当没有在sptSet中,有从u到v的边,
            // 并且总权重路径从src到v通过u小于当前dist[v]的值
            if (!sptSet[v] && graph[u][v] && dist[u] != INT_MAX 
                                       && dist[u] + graph[u][v] < dist[v])
                dist[v] = dist[u] + graph[u][v];
    }

    // 打印构造的距离数组
    printSolution(dist);
}

int main() {
    // 以邻接矩阵形式表示的图
    int graph[V][V] = {{0, 4, 0, 0, 0, 0, 0, 8, 0},
                       {4, 0, 8, 0, 0, 0, 0, 11, 0},
                       {0, 8, 0, 7, 0, 4, 0, 0, 2},
                       {0, 0, 7, 0, 9, 14, 0, 0, 0},
                       {0, 0, 0, 9, 0, 10, 0, 0, 0},
                       {0, 0, 4, 14, 10, 0, 2, 0, 0},
                       {0, 0, 0, 0, 0, 2, 0, 1, 6},
                       {8, 11, 0, 0, 0, 0, 1, 0, 7},
                       {0, 0, 2, 0, 0, 0, 6, 7, 0}};

    dijkstra(graph, 0); //

 0 作为源顶点

    return 0;
}

在这个程序中,我们首先定义了一个名为minDistance的函数,它从那些尚未被包含在最短路径树中的顶点集中挑出距离源点最近的顶点。接下来,我们定义了dijkstra函数,它实现了Dijkstra算法,并使用minDistance函数来选择下一个要处理的顶点。dijkstra函数首先初始化所有顶点的距离为无限大,然后逐步找出到每个顶点的最短路径。最后,我们在main函数中定义了图并调用了dijkstra函数。

  • 17
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

终将老去的穷苦程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值