代码参考资料:自购纸质资料答案修改
题目:求点0到点6的距离
思路:
目的是找某点到顶点的最小距离,先全设为超大值m
设一个点k,其表示目前到顶点距离最小的点,先把顶点序号赋给k。
从顶点开始,对其连通点的距离进行更新,遍历整个图,找最小值点(此时顶点不参与),把找到点的序号赋给k,
再从k开始对与其连通点的距离进行更新,遍历整个图,找最小值点(此时为k的点不参与),把找到点的序号赋给k,
直到所有点都遍历完,更新完毕。
难点:
1.循环次数
点数*点数,for循环
2.此时为k的点不参与
给所有点一个标记,当这个点作为k时,标记变化,下一轮找k时不再参与。
3.更新距离
判断目前点i的距离和目前k点距离+k点到i点距离,若大于,则更新。
步骤:
1.图的表示
输入图的邻接矩阵:七行表示七个点,每个元素为各点到其他点的距离,不相通点之间距离用自定义的超大数m表示。
2.初始化
设置每个节点所需变量:int dist[ 7], path[ 7], mark [ 7] = {0}, vex[7];
dist[i] = m;
path[i] = -1;
vex[i] = -2;/*设为全局变量便于函数调用或主函数中打印
dist目前每个点到顶点的最小距离, path目前每个点的前一个点, mark 目前点是否已经在最短链中,初始时均不在链中。*/
3.写一个遍历每个点的函数min(),找出目前有最小距离的点,将其赋予K
4.从第一个点开始更新距离
①判断和更新
int k, i; k = start; dist[k] = 0; for(int number=0;number < 7;number++) { for (i = 0; i < 7; i++) { if (mark[i] == 0) { if (dist[i] > dist[k] + A[k][i]) { //将与K点联通的点的距离进行判断更新 dist[i] = dist[k] + A[k][i]; path[i] = k; } } } k = Min(); mark[k] = 1; }
②找k点
int Min( ) { int w = 0; while (mark[w] != 0) { w++; } for ( int i = 0; i < 7; i++) { if (mark[ i] == 0 && dist[i] < dist[w]) { w = i; } } return w; }
③标记变化
mark[k] = 1;
④下一轮
#更新
if (mark[i] == 0) {
if (dist[i] > dist[k] + A[k][i])#找k
if (mark[ i] == 0 && dist[i] < dist[w]) {
w = i;
}上一轮的k不再参与
5.输出终点的距离
代码:
#include <stdio.h> #include <string.h> #include <math.h> # define m 5201314 int A[ 7] [ 7] = { { m, 4, 6, 6, m, m, m}, { m, m, 1, m, 7, m, m}, { m, m, m, m, 6, 4, m}, { m, m, 2, m, m, 5, m}, { m, m, m, m, m, m, 6}, { m, m, m, m, 1, m, 8}, { m, m, m, m, m, m, m} }; int dist[ 7], path[ 7], mark [ 7] = {0}; void initial() { int i; for ( i = 0; i < 7; i++) { dist[i] = m; path[i] = -2; } } int Min( ) { int w = 0; while (mark[w] != 0) { w++; } for ( int i = 0; i < 7; i++) { if (mark[ i] == 0 && dist[i] < dist[w]) { w = i; } } return w; } void _Dijkstra_(int start, int last) { int k, i; k = start; dist[k] = 0; for(int number=0;number < 7;number++) { for (i = 0; i < 7; i++) { if (mark[i] == 0) { if (dist[i] > dist[k] + A[k][i]) { //将与K点联通的点的距离进行判断更新 dist[i] = dist[k] + A[k][i]; path[i] = k; } } } k = Min(); mark[k] = 1; } } int main() { int start, end; scanf("%d", &start); getchar(); scanf("%d", &end); initial(); _Dijkstra_(start, end); printf("%d\n", dist[6]); for (int u = 0; u < 7; u++) { printf("%d->%d\ndist[%d]=%d\n", path[u], u, u, dist[u]); } }
结果:
python networkx 有向图 最短路径 有向图的最短路径问题
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
【LeetCode】2192. 有向无环图中一个节点的所有祖先
【LeetCode】2192. 有向无环图中一个节点的所有祖先
leetcode 数据结构与算法 C++ -
python求无向图的最短路径 matlab无向图最短路径
目录一、图的概念二、图的建立三、图的最短路径 Ⅰ、有向图 方法一:每对点的最短路径 方
python求无向图的最短路径 matlab 算法 矩阵 最短路径