`

Dijkstra算法(最短距离)

阅读更多

该算法由荷兰的一个牛人计算机科学家Edsger Wybe Dijkstra在1956年发现。

 

这套算法主要解决计算从一个点到其它的点的最短距离,而不是Floyd-Warshall算法的任意两点距离。


 如图,现要计算出,从1号点到其它各点的最短距离,首先我还是转化成矩阵

由此可见1号点到其它点的初始距离为:

 

0 1 12 ∞ ∞ ∞

 

 很明显2号点是离1号点最近的点,那么1号点到2号点的最短距离肯定就是直达了。那我就将2号点作为“换乘点”,来计算下距离:

 

0 1 10 4 ∞ ∞

 

 这个过程有个专业术语“松弛”。2号点我也已经用了,那么4号点是离1号最近的点了,那再用它来松弛下:

 

0 1 8 4 17 19

 接下来,就不费话了,继续松弛吧,直到所有点都用来松过。

 

这就是Dijkstra算法的思想,略屌,略屌!

现在用C来实现下:

 

#include <stdio.h>

int main()
{
    int a[10][10], dis[10], book[10], n, m, t1, t2, t3, i, j, k, min, u;

    int inf = 99999999;//这里定义的正无穷

    //读入nm,n为顶点数,m为边的条数
    scanf("%d %d", &n, &m);

    //初始化矩阵
    for (i = 1; i <= n; i++)
        for(j = 1; j <= n; j++)
            if(i == j)a[i][j] = 0;
            else a[i][j] = inf;


    //读入边
    for(i = 1; i <= m; i++)
    {
        scanf("%d %d %d", &t1, &t2, &t3);
        a[t1][t2] = t3;
    }

    //初始化dis,这里存的是从1号顶点到其它顶点的初始距离
    for(i = 1; i <= n; i++)
        dis[i] = a[1][i];


    //初始化book,标记某个点是否已经“松弛”过了
    for(i = 1; i <= n; i++)
        book[i] = 0;
    book[1] = 1;//从1到1的距离是0,为确定距离

    //Dijkstra算法核心代码
    for(i = 2; i <= n; i++)//这里从2开始,因为1号到1号不用算了。下面也一样
    {
        min = inf;
        //找到离i最近的顶点
        for(j = 2; j <= n; j++)
        {
            if(book[j] == 0 && dis[j] < min)
            {
                min = dis[j];
                u = j;
            }
        }
        book[u] = 1;

        for(k = 1; k <= n; k++)
        {
            if(a[u][k] < inf && dis[k] > dis[u] + a[u][k])
            {
                dis[k] = dis[u] + a[u][k];
            }
        }
    }

    for(i = 1; i <= n; i++)
        printf("%d \n", dis[i]);

    return 0;
}

 输入:

6 9
1 2 1
1 3 12
2 3 9
2 4 3
3 5 5
4 3 4
4 5 13
4 6 15
5 6 4

 得到结果:

0 1 8 4 13 17

 这套程序的时间复杂度为O(N2)。想想有什么办法还能优化它。

 

 

  • 大小: 25.9 KB
2
3
分享到:
评论

相关推荐

    Dijkstra_Dijkstra算法最短路径_

    Dijkstra算法,由荷兰计算机科学家艾兹格·迪科斯彻于1956年提出,是一种用于在加权图中寻找单源最短路径的算法。它保证了找到的路径是最优的,即从起点到每个顶点的路径长度都是最小的。在这个程序中,我们看到有两...

    最短路径算法dijkstra的matlab实现_dijkstra_最短路径算法_

    然后,用一个向量存储每个节点的最短距离,用一个数组记录节点是否已被访问。接下来,可以编写一个循环,按照Dijkstra算法的步骤进行操作。在MATLAB中,可以使用优先队列(如`heapq`库)来高效地找到未访问节点中...

    Dijkstra算法最短路径的C++实现与输出路径

    "Dijkstra算法最短路径的C++实现与输出路径" Dijkstra算法是解决单源最短路径问题的经典算法, 由荷兰计算机科学家Edsger W. Dijkstra在1956年提出。该算法可以解决从某个源点到其他所有顶点的最短路径问题。 ...

    Dijkstra算法求最短路径的C/C++程序一

    参数`D[]`存储从`v0`到其他顶点的最短距离,`P[][]`存储最短路径上的顶点序列。 ### 主函数 ```c void main() { // ... 省略代码 ... } ``` 主函数首先创建图`G`,然后调用`ShortestPath`函数计算从指定顶点到其他...

    Dijkstra算法找最短路径代码,dijkstra算法求最短路径,matlab

    首先,我们需要理解Dijkstra算法的基本思想:从起点开始,逐步扩展最短路径,每次选择当前未访问节点中距离起点最近的一个,并更新与它相邻节点的距离。这个过程不断迭代,直到所有节点都被访问或者找到目标节点。在...

    Dijkstra算法求最短路径——Java实现

    - 主函数:读取输入,构建图,调用Dijkstra算法,打印最短路径及距离。 为了完整地理解这个Java实现,你需要阅读并分析"ShortestPath.java"文件中的代码,特别是Dijkstra算法的实现部分。代码中可能包含了对节点、...

    Dijkstra最短路径算法的Matlab实现

    2. **主循环**:Dijkstra算法通过一个优先队列(通常用堆实现)进行迭代。每次从队列中取出当前距离最小的节点,并更新与其相邻的节点的距离。如果新路径比已知路径短,则更新该节点的距离,并将其重新插入优先队列...

    Dijkstra算法求最短路径算法 C++ 经典例题

    - 使用Dijkstra算法,我们可以计算出每个居民区到各个医院位置的最短距离,然后选择这个总和最小的医院位置。 - 文件"Cppp1.cpp"很可能是实现这个算法的源代码,而"题目.png"可能展示了问题的具体输入,如地图和...

    Dijkstra算法找最短路径代码_dijkstra_Dijkstra算法找最短路径代码_dijkstra算法_

    如果这个新距离小于当前记录的距离,就更新u的最短距离,并检查是否需要将u插入优先队列(如果新的距离更短)。 - 重复上述步骤,直到优先队列为空或者目标顶点被处理。 2. **实现细节**: - 可以使用二叉堆、...

    Dijkstra算法求最短路径的C/C++程序

    ### Dijkstra算法求最短路径的C/C++程序解析 #### 概述 Dijkstra算法是一种用于寻找图中两点间最短路径的经典算法,适用于有向无环图或无向图,前提是图中的边权非负。该算法通过构建一个最小生成树来找到源点到图...

    提交2_毕业设计_dijkstra_最短路径_dijkstra设计_最短路径算法_

    3. 更新距离:如果通过当前节点到达邻接节点的距离比已知的最短距离更短,则更新该邻接节点的距离。 4. 重复步骤2和3,直到队列为空或目标节点被访问。 "test.m"可能是测试脚本,用于输入不同的图结构和起始点,...

    最短路径算法Dijkstra源代码

    Dijkstra算法的核心思想是贪心策略,它每次选择当前未访问顶点中距离起点最近的一个,并更新与它相邻的顶点的距离。 源代码实现通常包括以下关键步骤: 1. 初始化:设置一个起点,将所有顶点的距离初始化为无穷大...

    Dijkstra算法寻找最短路径的完整源代码

    "Dijkstra算法寻找最短路径的完整源代码" 本资源提供了Dijkstra算法寻找最短路径的完整源代码,同时附带了Kruskal最小生成树算法。该程序提供了输入输出的完整控制台程序,能够帮助用户快速了解和应用Dijkstra算法...

    基于Dijkstra算法的最短路径实现与应用

    Dijkstra算法,由荷兰计算机科学家艾兹格·迪科斯彻提出,是一种寻找有向图中最短路径的经典算法。该算法主要用于解决单源最短路径问题,即从图中的一个特定起点(源节点)到其他所有节点的最短路径。算法的核心思想...

    基于Dijkstra算法的最短路径问题求解.123

    ### 基于Dijkstra算法的最短路径问题求解 #### 一、Dijkstra算法简介 Dijkstra算法是由荷兰计算机科学家Edsger W. Dijkstra于1956年提出的一种用于解决加权图中单源最短路径问题的算法。该算法能够有效地找出从...

    最短路径--Dijkstra算法.ppt

    Dijkstra算法和图结构表示 Dijkstra算法是一种常用的图搜索算法,用于计算图中的一条最短路径。该算法的主要思想是从图的某个顶点出发,逐步扩展到其他顶点,直到找到目标顶点的最短路径。 在本节中,我们将详细...

    Dijkstra算法求最短路径

    ### Dijkstra算法求最短路径 #### 算法简介 Dijkstra算法是一种用于寻找图中两点间最短路径的经典算法。它适用于无负权边的有向或无向图。该算法的基本思想是从起点出发,按距离由近及远的顺序依次确定各个顶点到...

    Dijkstra算法实现天津地铁最短路径查找

    Dijkstra算法是一种经典的图论算法,由荷兰计算机科学家艾兹格·迪科斯彻于1956年提出,主要用于解决单源最短路径问题。在这个场景中,我们利用Dijkstra算法来查找天津地铁网络中的最短路径。在VC++(Visual C++)...

Global site tag (gtag.js) - Google Analytics