#################本文为学习《图论算法及其MATLAB实现》的学习笔记#################
算法用途
计算图中两顶点间的最短路与次短路,并且它们至少有一条边或弧互异。
算法思想
首先,利用前面的算法求出从S到T的最短路,不妨设此最短路包含n0。条有向弧;然后,每次删去原权值矩阵W中最短路中的边(或有向边),从而得到n0个矩阵与W只有一个元素差别的新权值矩阵,并对这n0个权值矩阵分别求出一条从S到T的最短路,由这n0条最短路中选权值最短的,这样所得到的路就被称为所求出的从S到T的这条最短路的次短路。
程序参数说明
W: 图的权值矩阵
p1,p2: 最短路与次短路
d1,d2: 表示p1,p2的长度
算法程序详解
其中调用的f_path()函数详情
%两顶点间最短路和次短路
function [ p1,p2,d1,d2 ] = shorp2f( W )
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%% 输入: W: 图的权值矩阵
%%%%%%%%% 输出: p1,p2: 最短路与次短路
%%%%%%%%% d1,d2: 表示p1,p2的长度
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[p1, d1] = f_path(W); % 求出一条最短路
n = length(p1); % 计算最短路中的顶点数
d2 = inf;
for i = 1:(n-1)
A = W;
A(p1(i),p1(i+1)) = inf; % 删除最短路上的一条边(删除的是原图的边,即权值矩阵中的元素)
A(p1(i+1),p1(i)) = inf;
[m1, d] = f_path(A); % 重新计算最短路
if d < d2 % 若删去一条边后仍存在最短路
d2 = d; % 则此通路为次短路
p2 = m1;
end
end