迪杰斯特拉算法详解

迪杰斯特拉算法

迪杰斯特拉算法是由荷兰计算机科学家 狄克斯特拉于1959 年提出的,因此又叫 狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有向图最短路径问题它是求从源点到其余各点的最短路径

       算法的基本思想是:

               依路径长度递增的次序求得各条路径

假设图中所示为从源点到其余个点之间的最短路径,这些路径中,必存在一条长度最短者

 

                                  


 

 

 

1. 在这条路径上,必定只含一条(权值最小的)弧,由此,只要在所有从源点出发的弧中查找权值最小者

2. 长度次短的路径可能有两种情况:

      它可能是从源点直接到该点的路径

       也可能是,从源点到a,再从a到该点

(不可能是从源点到其它点再到该点,因为该点为次短路径,若存在,则就不是次短路径了)

3. 其余依次类推


A(源点)出发,A到各点的距离,其中 # 表示无穷大

节点

   B

    C

   D

    E

    F

  距离

    #

   10

   #

    30

   100

路径

 

   A C

  

   A E

   A F

显然 AC为最短路径,从C点出发找另一个点,若小于表中的更新

节点

   B

    C

   D

    E

    F

  距离

    #

   10

   60

    30

   100

路径

 

   A C

  ACD

   A E

   A F

显然 AE为最短路径,从E点出发找另一个点,若小于表中的更新

节点

   B

    C

   D

    E

    F

  距离

    #

   10

   50

    30

   90

路径

 

   A C

  AED

   A E

   AEF

显然 AD为最短路径,从D点出发找另一个点,若小于表中的更新

节点

   B

    C

   D

    E

    F

  距离

    #

   10

   50

    30

   60

路径

 

   A C

  AED

   A E

   AEDF

显然 AEDF为最短路径,从F点出发找另一个点,若小于表中的更新

F已经是最后一个了,结束

综上所诉:

最短路径   AC    AED   AE   AEDF 

核心代码:

int dijstra(int ii)  //ii是源点 
{  
    int i,j,min;  
    memset(visit,0,sizeof(visit));  
    for(i=1;i<=m;++i)  
    {  
        dis[i]=map[ii][i];   //找到与源点相连通的 
    }  
    visit[ii]=1; //标记源点 
    dis[ii]=0;   //源点到源点的距离设为0 
    for(i=1;i<m;i++)  
    {  int pos;
        min=inf;  
        for(j=1;j<=m;++j)  
        {  
            if(!visit[j]&&min>dis[j])  //找到与源点相连通的一点的最短路径 
            {  
                min=dis[j];  
                pos=j;                //保存起来 
            }  
        }  
        visit[pos]=1;        //pos点是当前最短路径 
        for(j=1;j<=m;++j)  
        {  
            if(!visit[j]&&dis[j]>dis[pos]+map[pos][j])  //找次短距离 
            dis[j]=dis[pos]+map[pos][j];  
        }  
    }  
    return dis[q];  
}



  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值