贪心算法之单源最短路径问题

一、问题

给定带权有向图G=(V,E),其中每条边的权是非负实数。另外,还给定V中的一个顶点,称为源。现在要计算从源到所有其它各顶点的最短路长度。这里路的长度是指路上各边权之和。这个问题通常称为单源最短路径问题。

二、算法及思想

Dijkstra算法是解单源最短路径问题的贪心算法。其基本思想是,设置顶点集合S,并不断地作贪心选择来扩充这个集合。一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知。

初始时,S中仅含有源。设u是图G的某一个顶点,把从源s到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组dist记录当前每个顶点所对应的最短特殊路径长度。Dijkstra算法每次从V-S中取出具有最短特殊路长度的顶点u,将u添加到S中,同时对数组dist作必要的修改。一旦S包含了所有V中顶点,dist就记录了从源到所有其它顶点之间的最短路径长度。

例如,对下面的有向图,应用Dijkstra算法计算从源顶点1到其它顶点间最短路径的过程列在下页的表中。

三、伪代码

void Dijkstra(Vertex s){       //s代表源顶点

while(1){

             V=未添加到S数组的顶点中dist最小的顶点;

             if(V不存在)

             break;

             S[V]=true;       //将顶点V加入到集合S中来,true代表已在集合S中

             for(V的每个邻接点W){

             if(S[W]==false)

                          if(dist[V]+E< V,W>< dist[W]){       //顶点V能使它的某个邻接点W到源点路径更短,则更新dist[W]

                          dist[W]=dist[V]+E<V,W>;       //E< V,W>代表连接顶点V和W的边的权值

                          path[W]=V;

                          }

             }           

             }

}

猜你喜欢

转载自blog.csdn.net/qq_32919451/article/details/81205625