分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
二之三续、Dijkstra 算法+Heap堆的完整c实现源码
作者:JULY、二零一一年三月十八日
出处:http://blog.csdn.net/v_JULY_v。
------------------------------------------
引言:
此文的写作目的很简单,就一个理由,个人认为:上一篇文章,二之再续、Dijkstra 算法+fibonacci堆的逐步c实现,写的不够好,特此再写Dijkstra 算法的一个续集,谓之二之三续。
鉴于读者理解斐波那契堆的难度,本文,以简单的最小堆为示例。同时,本程序也有参考网友的实现。有任何问题,欢迎指正。
Dijkstra 算法+Heap堆完整算法思想
在前一篇文章中,我们已经了解到,Dijkstra 算法如下:
DIJKSTRA(G, w, s)
1 INITIALIZE-SINGLE-SOURCE(G, s) //1、初始化结点工作
2 S ← Ø
3 Q ← V[G] //2、初始化队列
4 while Q ≠ Ø
5 do u ← EXTRACT-MIN(Q) //3、从最小队列中,抽取最小结点(在此之前,先建立最小堆)
6 S ← S ∪{u}
7 for each vertex v ∈ Adj[u]
8 do RELAX(u, v, w) //4、松弛操作。
如此,咱们不再赘述,直接即可轻松编写如下c/c++源码:
void dijkstra(ALGraph G,int s,int d[],int pi[],int Q[])
{ //Q[]是最小优先队列,Q[1..n]中存放的是图顶点标号,Q[0]中存放堆的大小
//优先队列中有key的概念,这里key可以从d[]中取得。比如说,Q[2]的大小(key)为 d[ Q[2] ]
initSingleSource(G,s,d,pi); //1、初始化结点工作
//2、初始化队列
Q[0] = G.vexnum;
for(int i=1;i<=Q[0];i++)
{
Q[i] = i-1;
}
Q[1] = s;
Q[s+1] =