这几天接触到一个题,完全没有思路,在网上查了一下发型要用迪杰斯特拉算法,研究了好几天,没办法太菜了,下面说一下我了解的迪杰斯特拉算法在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】就是最小距离点了。
}