单原点最短路径(采用Dijskra算法)

太浮躁,不塌实,一知半解。
写出的程序在白云上被攻的体无完肤。

自以为Dij算法理解清楚了,实际上还是没有完全领会要领,明白是对两个集合操作,却不清楚到底要不断更新哪个数据:一知半解!

花了好大力气,终于把这段程序搞定了,看起来还算舒服。

发此文自励之,万万要克服一知半解的坏毛病!


/*<br /> File name: Dij.c<br /> Description: 寻找最短路径,采用Dijskra算法<br /> */</p> <p>#include <stdio.h></p> <p>#define N 5<br /> #define O 1</p> <p>//集合标志<br /> #define S 0<br /> #define R 1</p> <p>#define INF 0xFFFF</p> <p>int Near[N]; //V0到其他点的最短距离<br /> int path[N];</p> <p>void Dij(int A[][N],int path[])<br /> {<br /> int i,j;<br /> int n=N;<br /> int v;<br /> int shortest;<br /> int bitmap[N]; //集合标志</p> <p> for(i=0;i<n></n><n></n><n><=shortest){ v=j; //记录下最近点的下标 shortest=Near[j]; //记录下最短距离 } } } bitmap[v]=S; //将在V中找到的离S最近的v点取出加入到S集合中 //更新V0到S集合所有点的距离 for(j=0;j</n><n>< Near[j]){ Near[j]=shortest+A[v][j]; //更新V0到R集合中所有点的路径长度 //求取路径 path[j]=v;//记录下是谁指向j节点,这个记录是不断更新的,直到最后一次才能确定 } } } } } void print_path(int path[],int i) { printf("COST(%d to %d) = %dt",O+1,i+1,path[i]); //print path O->i</p> <p> if(path[i]==-1) { printf(&#8220;**n&#8221;);return; }<br /> while(1){<br /> printf(&#8220;%d&#8221;,i+1);<br /> i=path[i];<br /> if(i==path[i]){<br /> printf(&#8220;<-%d",O+1); break; } printf("<-"); }; printf("n"); } int main() { int s[N][N]={ {0,2,1,INF,INF}, {INF,0,INF,1,3}, {INF,2,0,INF,5}, {INF,INF,INF,0,1}, {INF,INF,INF,INF,0} }; int i,j; printf("Orignal Martixn"); for(j=0;j</n><n></n><n></n><n></n></stdio.h>

发表评论

邮箱地址不会被公开。 必填项已用*标注