int dijkstra(Graph g, int start, int end, int *path) { int finally[g.N],dist[g.N],pass[g.N]; for(int i=0;i<g.N;i++) { finally[i]=0; dist[i]=g.matrix[start][i]; pass[i]=-1; } finally[start]=0; dist[start]=0; int min; int before; if(start==0) before=1; else before=0; for(int time=0; time<4; time++) { for(int i=0; i<g.N; i++) { if(finally[i]!=1) { min=i; break; } } for(int i=0; i<g.N; i++) { if(finally[i]!=1&&dist[i]<dist[min]) { min=i; } } finally[min]=1; pass[min]=before; for(int i=0; i<g.N; i++) { if(finally[i]!=1&&g.matrix[min][i]+dist[min]<dist[i]) { dist[i]=g.matrix[min][i]+dist[min]; path[i]=min; } } before=min; } path[0]=start; int j=1,paths[g.N]; int ends=end; while(pass[end]!=-1)//输出路径 { paths[j]=ends; ends=pass[ends]; j++; } for(int i=1;i<=j;i++) { path[i]=paths[j-i]; } return dist[end];}改进代码
时间: 2023-06-10 16:07:38 浏览: 156
dijkstra的C++源代码
这段代码是 Dijkstra 算法的实现,用于求解图中两个顶点之间的最短路径。具体来说,它维护三个数组 finally、dist 和 pass,以及一个变量 before。finally 数组表示当前已经找到最短路径的顶点集合,dist 数组表示起点到每个顶点的最短距离,pass 数组表示起点到每个顶点的最短路径上的前驱顶点,before 变量则是为了处理起点为 0 的情况。算法的基本思路是从起点开始,每次选择一个距离起点最短且未被确定最短路径的顶点,然后更新其它顶点的最短距离和前驱顶点。当所有顶点都被确定最短路径后,可以根据 pass 数组回溯得到起点到终点的最短路径。其中,第一个 for 循环初始化数组,第二个 for 循环是主循环,执行了 4 次,第三个和第四个 for 循环分别用于寻找距离起点最近的未确定最短路径的顶点,和更新其它顶点的最短距离和前驱顶点。需要注意的是,这段代码中存在未完整的 for 循环,需要补充完整以确保算法正确执行。
阅读全文