dijkstra算法:
核心:
searchroot = (!visit[j]) && min(minpath[j])
//搜索节点为最短路径里面未被访问过的最小距离点
minpath[j] = min{minpath[searchroot]+map[searchroot][j],minpath[j]}
//最短路径为当前已知路径与搜索路径已知最短路径到当前结点的距离的最小值
设有 a,b,c,d,e 点, 另 最短路径为minint 初始化为MAX , 令起点为a 标记起点 令其处于已访问状态(找寻最小值的循环只需 a to e -1 次),
其中算法表示为:
for i = b to e
for j = a to e
if !visit[j] && minpath[j] < minint
minint = minpath[j]
searchroot = j
visit[searchroot]=1
for j = a to e
if !visit[j] && minpath[j] > minpath[searchroot] + map[searchroot][j]
minpath[j] = minpath[searchroot] + map[searchroot][j]
注:MAX 为无穷大,按邻接矩阵表示 自身到自身为 0 无法到达为 MAX
const int size=9;
const int MAX=1000000;
int minpath[size];
int visit[size];
int father[size];
int map[size][size]={
{ 0,4,MAX,MAX,MAX,MAX,MAX,8,MAX },
{ 4,0,8,MAX,MAX,MAX,MAX,11,MAX },
{ MAX,8,0,7,MAX,4,MAX,MAX,2 },
{ MAX,MAX,7,0,9,14,MAX,MAX,MAX },
{ MAX,MAX,MAX,9,0,10,MAX,MAX,MAX },
{ MAX,MAX,4,14,10,0,2,MAX,MAX },
{ MAX,MAX,MAX,MAX,MAX,2,0,1,6 },
{ 8,11,MAX,MAX,MAX,MAX,1,0,7 },
{ MAX,MAX,2,MAX,MAX,MAX,6,7,0 }
};
int root=0;
for(int i=0;i<size;i++)
{
father[i]=0;//初始化前驱点
minpath[i]=map[root][i];//初始化权
visit[i]=0;//初始化访问记录
}
visit[root]=1;
int searchroot;
for(int i=1;i<size;i++)
{//起始点已访问
int mincost=MAX;
for(int j=0;j<size;j++)
{//找最小总权
if((!visit[j])&&minpath[j]<mincost)
{
mincost=minpath[j];
searchroot=j;
}
}
visit[searchroot]=1;
for(int j=0;j<size;j++)
{
if((!visit[j])&&minpath[j]>minpath[searchroot]+map[searchroot][j])
{
minpath[j]=minpath[searchroot]+map[searchroot][j];
father[j]=searchroot;
}
}
}
for(int i=1;i<size;i++)
{
cout<<"a to "<<(char)(i+'a')<<"'s minpath is "<<minpath[i]<<endl;
}
for(int i=1;i<size;i++)
{
int lo=i;
while(lo)
{
cout<<(char)(lo+'a')<<" <-- ";
lo=father[lo];
}
cout<<'a'<<endl;
}
dijkstra核心:找离起点最近点搜索。