某公司在六个城市 c1 到其它城市间的票价便宜的路线图。
变量解释:
- n 是公司个数
- a 存储航路票价,最后结束循环存储的是最便宜票价
- path 存储每对顶点之间最短路径上所经过的定点的序号,也就是”中转站”序号
clear;clc; n = 6; a = [0 50 inf 40 25 10; 0 0 15 20 inf 25; 0 0 0 10 20 inf; 0 0 0 0 10 25; 0 0 0 0 0 55; 0 0 0 0 0 0]; % 由于 a 是无向图,航路票价沿着正对角线对称,可以只写出右上角 a = a + a'; % 由于票价沿正对角线对称,即完整的 a 为 a + a 的转置 path = zeros(6); % 定义 path 为 6 x 6 的矩阵 for k = 1:n for i = 1:n for j = 1:n if a(i,j) > a(i,k) + a(k,j) % 如果从 i 城市到 j 城市的票价大于从 i 城市到 k,再从 k 到 j 城,那么 i 到 j 城肯定不是最短路径 a(i,j) = a(i,k) + a(k,j); % 更新 i 到 j 的最少票价 path(i,j) = k; % 同时记录下 i 到 j 的"中转站" % 注意下一次更新会覆盖上一次 path(i,j) 存储的,所以其实 path(i,j)中存储的 只是最后一个 "中转站" end end end end a,path