最短路径(迪杰斯特拉求法)
发布日期:2021-05-07 02:33:28 浏览次数:38 分类:精选文章

本文共 1251 字,大约阅读时间需要 4 分钟。

Dijkstra算法实现

Dijkstra算法是一种广泛使用的最短路径算法,适用于图中从单一起始点到所有其他点的最短路径计算。以下是该算法的实现思路和步骤:

生成初始化数组

  • 邻接矩阵初始化:首先,初始化一个邻接矩阵p,用于存储图中各点之间的权值。
  • 权值数组初始化:创建一个数组pre,用于存储从起始点到各点的当前最短路径权值。
  • 算法步骤

  • 设置起始点:将起始点的权值初始化为0,并标记为已访问。
  • 优先队列处理:使用优先队列(如堆)来处理点,优先处理权值最小的点。
  • 更新最短路径:对于每个处理的点,更新其未访问邻点的最短路径,直到所有点都被访问或没有更短路径。
  • 代码实现

    int pre[n]; // 存储当前点的最短路径权值
    int p[n][n]; // 邻接矩阵
    void djex(int x, int n) {
    int i, j, k, min;
    int final[1005]; // 标记已访问点
    for (i = 1; i <= n; ++i) {
    pre[i] = p[x][i]; // 初始化权值数组
    final[i] = 0; // 初始化标记
    }
    pre[x] = 0; // 起始点自身权值为0
    final[x] = 1; // 标记为已访问
    for (i = 1; i < n; ++i) {
    min = INF;
    k = x;
    for (j = 1; j <= n; ++j) {
    if (!final[j] && pre[j] < min) {
    k = j;
    min = pre[j];
    }
    }
    if (min == INF) break; // 无路可走
    final[k] = 1; // 标记当前点为已访问
    for (j = 1; j <= n; ++j) {
    if (!final[j] && pre[k] + p[k][j] < pre[j]) {
    pre[j] = pre[k] + p[k][j];
    }
    }
    }
    printf("%d", pre[n]);
    }

    代码解释

  • 初始化数组pre数组存储从起始点到各点的当前最短路径权值,final数组用于标记点是否已访问。
  • 优先处理点:使用优先队列处理权值最小的点,更新其邻点的最短路径。
  • 终止条件:当无法找到更短路径时(即权值为无穷大),终止算法。
  • 这个实现通过Dijkstra算法高效地计算了从起始点到所有其他点的最短路径,适用于大规模图的最短路径问题。

    上一篇:数据结构第六章第(树--总结)
    下一篇:并查集(初学)

    发表评论

    最新留言

    关注你微信了!
    [***.104.42.241]2025年04月08日 11时25分15秒