笔记:最短路径算法—Dijkstra(迪杰斯特拉)

Posted wozaixuexi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了笔记:最短路径算法—Dijkstra(迪杰斯特拉)相关的知识,希望对你有一定的参考价值。

技术分享图片

文中代码下如下:

#include<iostream>
#include<cstdio>
#include<fstream>
#include<algorithm>
#include<string>
#include<sstream>
#include<cstring>
    using namespace std;    
int e[10][10],dis[10],book[10];
int main()
{
    int i,j,n,m,t1,t2,t3,u,v,min;
    int inf=99999999; //用inf(infinity的缩写)存储一个我们认为的正无穷值    
     cin>>n>>m;   //读入n和m,n表示顶点个数,m表示边的条数
                                                                
    //初始化
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            if(i==j) e[i][j]=0;
              else e[i][j]=inf;

                                                                             
    //读入边
    for(i=1;i<=m;i++)
    {
        cin>>t1>>t2>>t3;//t1 t2是顶点,t3是边 
        e[t1][t2]=t3;  //给t1 t2之间的距离 赋值t3 
    }
    
    //初始化dis数组,这里是1号顶点到其余各个顶点的初始路程
    for(i=1;i<=n;i++)
        dis[i]=e[1][i];
        
    //book数组初始化
    for(i=1;i<=n;i++)
        book[i]=0;  //设所有最短路的顶点未知的 
    book[1]=1;     //设置源点1是已知的顶点 
                                                                   
    
    //Dijkstra算法核心语句
    for(i=1;i<=n-1;i++)
    {        
        //找到离1号顶点最近的顶点(贪心法?)
        min=inf;        
        for(j=1;j<=n;j++)
        {
            if(book[j]==0 && dis[j]<min)//因为book[1]=1已被设置为源顶点=1,所以这条语句 
            {                           // 实际上是找未知道顶点中离源顶点book[1]直接距离最近的顶点 
                min=dis[j];//更新最近的顶点 
                u=j;  //最后把这个找到的最近顶点赋值给u,因为后面的book[u]要标记一下。    
            }                      
        }
        book[u]=1;//更新为离源顶点1最近的已知顶点    如果有优先队列优化 ,这里便是出队(最近的顶点)
        
        for(v=1;v<=n;v++)//松驰操作(BFS?拓展?) 
        {
            if(e[u][v]<inf)
            {
                if(dis[v]>dis[u]+e[u][v])//dis[u]是的意思是源点1->u最近的距离,e[u][v]表示u顶点到v顶点的距离
                                      //dis[u]+e[u][v]的意思就是1->u->v 的距离                
                  dis[v]=dis[u]+e[u][v];//更新1->v的距离(包括直接或间接距离) 
            }
        }
    }
     
                                                                 
    //输出最终的结果
    for(i=1;i<=n;i++)
        cout<<dis[i]<<" ";//输出1号顶点到所有点的最短路 
    return 0;
}

 

以上是关于笔记:最短路径算法—Dijkstra(迪杰斯特拉)的主要内容,如果未能解决你的问题,请参考以下文章

(王道408考研数据结构)第六章图-第四节4:最短路径之迪杰斯特拉算法(思想代码演示答题规范)

最短路径 - 迪杰斯特拉(Dijkstra)算法

【数据结构】最短路径之迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法

图解迪杰斯特拉(Dijkstra)最短路径算法

[C++]单源最短路径:迪杰斯特拉(Dijkstra)算法(贪心算法)

最短路之Dijkstra(迪杰斯特拉)