图的最短路径

迪杰斯特拉算法

单源点路径

  • 数组D[i]来存储最短路径,以初始点进行初始化。
  • 找到当前D[i]中最短的路径D[j],即确定当前最短。
  • 以Vj为中中转点,更新D[i],即如果D[i]>D[j]+arcs[j][i],就D[i]=D[j]+arcs[j][i]赋值操作;再继续重复第2步。
  • 直至该单源点到所有顶点的最短路径都以确定。
    在这里插入图片描述

初始化

012345
01030100

当前最短是D[2] == 10,所以下一步以V2为中转点,更新D;
D[1]== ∞ , D[2] +arcs[2][1] == ∞,所以D[3] = ∞;
D[3]== ∞ > D[2] +arcs[2][3] == 60,所以D[3] = 60;
D[4]== 30 < D[2] +arcs[2][4] == ∞,所以D[3] = 30;
D[4]==100 > D[2] +arcs[2][5] == ∞,所以D[3] = 100;

012345
0106030100

当前最短是D[4] == 30,所以下一步以V4为中转点,更新D;

012345
010503090

当前最短是D[3] == 50,所以下一步以V5为中转点,更新D;

012345
010503060

当前最短是D[3] == 50,最短路径全部求出,结束。

012345
010503060

弗洛伊德算法

每一对顶点之间的最短路径


进行N次的迪杰斯特拉算法,也可以求出这个结果


弗洛伊德算法步骤:

需要两个二维数组D,P;其中D是存储各顶点间额最短路径,P是存储中转点。

  1. 初始两个数组。
  2. 以Vk(k∈(0,n))为中转点,如果D[i][j] >D[i][k]+D[k][j],就D[i][j] =D[i][k]+D[k][j]赋值更新D[i][j],即Vi到Vj的最短路径;且P[i][j]=k。已直重复第2步。
  3. 直到以Vn为中转点,D,P更新结束。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值