dijkstra算法求最短路径

本文详细介绍迪杰斯特拉算法的基本原理与实现过程,包括所需的数据结构、算法步骤及伪代码示例。通过逐步解析,帮助读者理解如何寻找图中两点间的最短路径。

一、所需数据结构

1、Bool Final[v] if v找到最短最路径,则值为True;

2、D[v] 表示v到v0的最短路径;

3、dis[v][w] 表示v到w的边长度,如果v与w没有直接相连则为INF。

二、算法描述

1、初始化,Final数组除v0点其余全部为False,D[v]=dis[v0][v];

2、从D[]中选出最小的且没找到最短路径的点v,即min(D[]) && !Final[],这个点找到了最短路径,把该点Final取反。(证明:为了描述方便,把已经找到最短路径的点,即Final[]为True的点集合称为S,剩下的点为T,那么T中的点w的最短路径为min{(v0,w),(v0,v)+(v,w)}, v是S中的点, 为什么一定是这样呢,因为假设还经过S以外的点,那么这个点一定存在比S中更短的路径,这与我们按从小到大顺序依次选择v矛盾。)更新所有与v相连且!Final[]的点w,判断D[v]+dis[v][w]<D[w];

3、重复2 n-1次。

三、参考代码

void dijsktra(int s,int d,int Max)
{
    int Final[Max],D[Max],v,w,Min;

    for( v=0;v<n;v++)           //初始化
    {
        Final[v]=0;
        D[v]=dis[s][v];  
    }
    for(w=0;w<n;w++)
        if(D[w]<INF)
            p[w]=0;
    D[s]=0;                    //源点最短路径就是0,且已经找到
    Final[s]=1;

    for(i=1;i<n;i++)
    {
        Min=INF;
        for( w=0;w<n;w++)       //找出T中D[]最小的点
            if(!Final[w])
                if(D[w]<Min)
                {
                    v=w;
                    Min=D[w];
                }
        if(Min<INF)Final[v]=1;  //如果成功找到,该点则为最短路径。
        else break;           //否则,非连通图
        for(w=0;w<n;w++)        //将与该点相连的T中的点更新
            if(!Final[w]&&(Min + dis[v][w]<D[w]))
            {
                D[w]=Min+dis[v][w];
                p[w]=v;
            }
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值