您的位置:首页 > 其它

单源最短路径(Dijkstra算法)

2017-05-31 22:14 225 查看
Dijkstra:迪杰斯特拉

Dijkstra算法是解单源最短路径问题的贪心算法。其基本思想是,设置顶点集合点集合S并不断地做贪心选择来扩充这个集合。

算法步骤:

(1)初始时,S只包含源点,即S={v},v的距离为0。U包含除v外的其他顶点,即:U={其余顶点},若v与U中顶点u有边,则<u,v>正常有权值,若u不是v的出边邻接点,则<u,v>权值为∞。

(2)从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。

(3)以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值为顶点k的距离加上顶点k到u边上的权。

(4)重复步骤b和c直到所有顶点都包含在S中。



(图片来源于网络)

关键代码:

//参数:邻接矩阵、源顶点、当前每个顶点所对应的最短特殊路径长度、路径前一点记录
void Dijkstra(int matrix[]
, int v0, int dist[], int prev[])
{
int s
;
int i,j,k;
int mindis,dis;

//初始化
for(i=1;i<=n;i++)
{
dist[i]=matrix[v0][i];
s[i]=false;
if(dist[i] == M)
prev[i]=0;
else
prev[i]=v0;
}

dist[v0]=0;
s[v0] =1; //标记v0

//在当前还未找到最短路径的顶点中寻找具有最短距离的路径
for(i=1;i<N;i++)
{
mindis=M;
int u=v0;
for(int j=1;i<=n;j++)                   //求离出发点最近的顶点
{
if(s[j]==0 && dist[j]<mindis)
{
mindis = dist[j];
u=j;
}
}
s[u]=true;

for(j=1;j<=n;j++)                       //修改递增路径序列(集合)
{
if(s[j]==0 && matrix[u][j]<M)   //还未求得最短路径的顶点
{
dis = dist[u] + matrix[u][j];
if(dist[j]>dis)
{
dist[j]=dis;
prev[j]=u;
}
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: