贪心算法之单源最短路径问题
一、问题
给定带权有向图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< dist[W]){ //顶点V能使它的某个邻接点W到源点路径更短,则更新dist[W]
dist[W]=dist[V]+E<V,W>; //E代表连接顶点V和W的边的权值
path[W]=V;
}
}
}
}