- 迪杰斯特拉算法的思想:我从一点开始,计算这个点到其他点的最短路径。想完成这样一件事,你需要做这些事情:
①得找一个“车道标记”,记录哪些点已经被你纳入路径当中了。
②得找一个“指示牌”,看看哪个点能够和你之前的通路产生联系。
③一个“GPS导航”,看看接下来是按照原路径走更近,还是抄新路更近。
为此,准备以下工具:
Ⅰ、dist[maxSize]:用来记录当前的最短路径长度。
Ⅱ、path[maxSize]:用来记录走过的路径,这样当有新的点可以达到的时候,你可以通过path[vi-1]+d(新纳入点距离到可达点距离)和dist[vi]进行比较,取其中比较小的作为新的最短路径。
Ⅲ、set[maxSize]:谁进来我就给谁标记成1,初识的点直接就是1。
void Dikstra(MGraph g,int v,int dist[],int path[])//v是开始点
{
int set[maxSize];//标识数组
int min,i,j,u;//这是进行一些操作要用到的量
for(i=0;i<g.n;++i)
{
dist[i] = g.edges[v][i];//初始化dist数组
set[i]=0;//初始化set
if(g.edges[v][i]<INF)
path[i]=v;
else
path[i]=-1;
}
set[v]=1;path[v]=-1;
}//所有的工具全部就绪,开始工作吧
for(i=0;i<g.n-1;++i)
{
min = INF;
//最开始的最小是极小值
for(j=0;j<g.n;++j)//通过这个循环可以筛选出现在可以达到的点中的最小值
if(set[j]==0&&dist[j]<min)
{
u=j;
min=dist[j];
}
set[u]=1;
for(j=0;j<g.n;++j)
{//这个用来判断是否有新的最短路径
if(set[j]==0&&dist[u]+g.edge[u][j]<dist[j])
{
dist[j]=dist[u]+g.edges[u][j];
path[j]=u;
}
}
}
}