迪杰斯特拉算法
迪杰斯特拉算法是由荷兰计算机科学家 狄克斯特拉于1959 年提出的,因此又叫 狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题,它是求从源点到其余各点的最短路径。
算法的基本思想是:
依路径长度递增的次序求得各条路径
假设图中所示为从源点到其余个点之间的最短路径,这些路径中,必存在一条长度最短者
1. 在这条路径上,必定只含一条(权值最小的)弧,由此,只要在所有从源点出发的弧中查找权值最小者
2. 长度次短的路径可能有两种情况:
它可能是从源点直接到该点的路径
也可能是,从源点到a,再从a到该点
(不可能是从源点到其它点再到该点,因为该点为次短路径,若存在,则就不是次短路径了)
3. 其余依次类推
从A(源点)出发,A到各点的距离,其中 # 表示无穷大
节点 | B | C | D | E | F |
距离 | # | 10 | # | 30 | 100 |
路径 |
| A C |
| A E | A F |
显然 AC为最短路径,从C点出发找另一个点,若小于表中的更新
节点 | B | C | D | E | F |
距离 | # | 10 | 60 | 30 | 100 |
路径 |
| A C | ACD | A E | A F |
显然 AE为最短路径,从E点出发找另一个点,若小于表中的更新
节点 | B | C | D | E | F |
距离 | # | 10 | 50 | 30 | 90 |
路径 |
| A C | AED | A E | AEF |
显然 AD为最短路径,从D点出发找另一个点,若小于表中的更新
节点 | B | C | D | E | F |
距离 | # | 10 | 50 | 30 | 60 |
路径 |
| A C | AED | A E | AEDF |
显然 AEDF为最短路径,从F点出发找另一个点,若小于表中的更新
F已经是最后一个了,结束
综上所诉:
最短路径 AC AED AE AEDF
核心代码:
int dijstra(int ii) //ii是源点
{
int i,j,min;
memset(visit,0,sizeof(visit));
for(i=1;i<=m;++i)
{
dis[i]=map[ii][i]; //找到与源点相连通的
}
visit[ii]=1; //标记源点
dis[ii]=0; //源点到源点的距离设为0
for(i=1;i<m;i++)
{ int pos;
min=inf;
for(j=1;j<=m;++j)
{
if(!visit[j]&&min>dis[j]) //找到与源点相连通的一点的最短路径
{
min=dis[j];
pos=j; //保存起来
}
}
visit[pos]=1; //pos点是当前最短路径
for(j=1;j<=m;++j)
{
if(!visit[j]&&dis[j]>dis[pos]+map[pos][j]) //找次短距离
dis[j]=dis[pos]+map[pos][j];
}
}
return dis[q];
}