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

被折叠的 条评论
为什么被折叠?



