迪杰斯特拉(Dijkstra)算法

这几天接触到一个题,完全没有思路,在网上查了一下发型要用迪杰斯特拉算法,研究了好几天,没办法太菜了,下面说一下我了解的迪杰斯特拉算法在c++中的运用方法。

迪杰斯特拉算法是一个最短路径的方法,在这里简称dij,它在确立出发点的基础上,设出发点是start,你想到达的点是end,其中一共有n个点,我们可以先找一步到达的距离,然后与分两步到达的距离比较,取最小值,然后让得到的结果与三步到达的距离比较,取最小值,最终让得的的最小值与n-1部到达的距离比较,取最小值,这样的最小值就是我们要得到的距离最少的最优点了。

但dij在c++中实现可不是那么好实现的,我们要把点之间的距离全部得到,在刚开始的几部中如果你要求start到end之间的距离,比如1,2,3点,1-2之间距离是1,2-3之间距离是1,1-3之间距离是1,这样1-3的距离最短就是1,为了避免类似1-2-3这样的情况,就是我上面一段说的那些了,我们要分步的比较,在c++中我们一般会用这样的方法:min是否大于1-3+3-4这样的形式,而1-3本身可能并不是最小值,因此我们在计算过程中不只把start到end的最小值算了出来,我们还把start到所有点的最小值算了出来。下面介绍一下dij在c++中实现的函数:

 

int i,j,k,min,tmp;

void dij(int start,int dist【】,flag【】) //dist【i】意是点start到点i的距离,flag【i】=0意思是点start到i的距离最小值未得到,=1意思是已经得到最短距离。我们确立flag的目的是防止重复与过多的循环。

{

for(i=1;i<=n;++i)     //详细的没有指出,n是指全部的点

{flag[i]=0;

dist[i]=long[1][i]     //long表示1-i之间的距离   }

flag【start】=1;  //出发点与出发点的最短距离,默认为已知

dist【start】=0;  //出发点与出发点的距离0;

//这之后就是在从start1步到达end和n-1步到达end的最短距离的比较选择,也是dij中的核心

for(i=1;i<n;++i){

min=inf;   //inf是一个极大值,表示无穷大的数。

for(j=1;j<=n;++j) if(flag[j]==0&&dist[j]<min)  {min=dist[j]; k=j;}

flag[k]=1;  //因为一步里面到达的它是距离最少的,所以start到k点距离最小。

//下面的循环就是求第二步到第n-1步最小值的。不太好掌握

for(j=1;j<=n;++j){ tmp= long[k][j]==INF ? INF : (min + mMatrix[k][j]));  if(flag[j]==0&&dist[j]>temp) dist【j】=tmp;}//不仅如此,在这一步中我们得到了每一个分两步到达各点的距离的最小值,然后返回上一个循环找到两步到达的最小值的点,然后再进行这一个循环得到分三步到达的点的距离的最小值,以此类推。

然后我们想要到哪个点,直接用dist【i】就是最小距离点了。

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值