数据结构 最短路径之—迪杰斯特拉算法

来源:互联网 发布:c 五子棋源码 编辑:程序博客网 时间:2024/05/18 12:05
#define MAXVEX 9#define INFINITY 65535typedef int PathMatrix[MAXVEX]//用于存储最短路径下标的数组typedef int ShortPathTable[MAXVEX]//用于存储到各点最短路径的权值和  比如V0到V2的权值是4 void ShortestPath_DIJ(MGraph G, int V0, PathMatrix &P, ShortPathTable &D) //V0表示传递进来的原点。{int final[MAXVEX]; //final[v] = 1 表示已经求得顶点V0到Vw的最短路径。为1的话表明已经取得,为0的话表明还没有取得。//初始化数据for(v=0; v<G.numVertexes; v++){final[v] = 0;//全部顶点初始化为未找到的最短路径(*D)[V] = G.arc[v0][v];//将与v0点有联系的顶点加上权值。  在邻接矩阵中,从V0到V8的最大顶点数开始遍历。(*p)[V] = 0;                //初始化路径数组P为0;}(*D)[V0] = 0;                  //v0到v0的路径为0final[V0] = 1;                //V0到V0不需要求路径。//开始主循环,每次求得V0到某个V顶点的最短路径 这个循环分为两部分,根prim算法一样,先求出第一部分,然后进行纠正更新。for(v=1; v< G.numVertexes; v++) //从1开始的,从第一个顶点开始探讨{min = INFINITY;//从D数组中找到最小的值。for(w=0; w<G.numVertexes; w++){if(!final[w] && (*D)[w]<min) //final的值1 !fina[w] 就为0 就不用后面判断了。不执行下面的语句。{k = w;min = (*D)[w];}}final[k] = 1;//修正当前最短路径以及距离for (w=0; w<G.numVertexes; w++){if(!final[w] && min+G.arc[k][w] < [*D][w]){(*D)[w] = min + G.arc[k][w]  //修正当前路径长度; 前驱顶点和其他顶点的长度。且和前面的长度累积比大小。(*p)[w] = k;                 //存放前驱顶点。 前驱结点和这个结点相连接的权值之和为<(*D)[k].}}}}

详情过程可以参考这个! 

http://wenku.baidu.com/view/6dc5c62486c24028915f804d2b160b4e767f810f

0 0