Dijkstra求解最短路问题

Dijkstra求解最短路问题

1. 问题

下图使用Dijkstra算法求由顶点a到顶点h的最短路径,按实验报告模板编写算法。
Dijkstra求解最短路问题_第1张图片
问题描述:在有向图 G= 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径。(单源最短路径)

2. 解析

  1. 初始时,S只包含源点,即S={v},v的距离为0。U包含除v外的其他顶点,即:U={其余顶点},若v与U中顶点u有边,则 v>正常有权值,若u不是v的出边邻接点,则权值为∞。

  2. 从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。

  3. 以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。

  4. 重复步骤b和c直到所有顶点都包含在S中。

3. 设计



void dijkstra(int u)  //参数是源点编号
{
     for(i from 1 to n ) 
     {
        dis[i] = min(dis[i],
	map[start][i]);//先更新一遍
     }
     for(i from 1 to n) 
     {
        int minn = inf; 
        for(j from 1 to n)
        {
         if(如果j点未走过且离源点最近) {
             minn = dis[j];
            start = j;//找到离源点 最近的点,然后把编号记录下来,用于搜索。
          }
        } 
           book[start] = 1;
           for(j from 1 to n )
           {
              dis[j] = min(dis[j],
	      dis[start]+map[start][j]);//以新的点来更新dis。
            }     
       }
}

4. 分析

5. 源码

https://github.com/Bacsonlx/Algorithm-analysis

你可能感兴趣的:(算法)