单源最短路径(Dijkstra算法)

来源:互联网 发布:华西电子盘软件下载 编辑:程序博客网 时间:2024/05/19 18:44

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[][N], int v0, int dist[], int prev[]){int s[N];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;elseprev[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;}}}}}