代碼來源:《圖論算法及其matlab實現》(北京航空航天出版社)
P25
首先,函數n2shorf用來計算任意兩點之間最短路徑長度及最短路經過的節點
需輸入起點、終點
1 function [ P u] = n2shorf( W,k1,k2) 2 3 %W表示權值矩陣 4 %k1表示始點,k2表示終點 5 %P表示兩頂點之間最短路,u表示最短路的距離 6 7 8 %初始化 9 n=length(W); 10 U=W; 11 m=1; 12 %Floyd算法思想 13 while m<=n 14 for i=1:n 15 for j=1:n 16 if U(i,j)>U(i,m)+U(m,j) 17 U(i,j)=U(i,m)+U(m,j); 18 end 19 end 20 end 21 m=m+1; 22 end 23 u=U(k1,k2);%最短路的距離 24 25 %求任意給定兩個頂點的最短路包含的頂點 26 27 P1=zeros(1,n); 28 k=1; 29 P1(k)=k2; 30 V=ones(1,n)*inf; 31 kk=k2; 32 while kk~=k1 33 for i=1:n 34 V(1,i)=U(k1,kk)-W(i,kk); 35 if V(1,i)==U(k1,i) 36 P1(k+1)=i; 37 kk=i; 38 k=k+1; 39 end 40 end 41 end 42 k=1; 43 wrow=find(P1~=0); 44 for j=length(wrow):(-1):1 45 P(k)=P1(wrow(j)); 46 k=k+1; 47 end 48 49 50 51 end
接下來,cn2shorf函數用來尋找通過指定兩個點的最短路徑
需要輸入起點、終點
需要通過的兩個點
function [P d]=cn2shorf(W,k1,k2,t1,t2) % 必須通過指定的兩個點的最短路 % function [P d]=cn2shorf(W,k1,k2,t1,t2) % W 圖的權值矩陣 k1 始點 k2 終點 t1 指定的點1 t2 指定的點2 % P 最終得到的路 % d 路的長度 % 路中的重復點記做一個點 [p1 d1]=n2shorf(W,k1,t1); % 計算k1,t1之間的最短路 [p2 d2]=n2shorf(W,t1,t2); % 計算t1,t2之間的最短路 [p3 d3]=n2shorf(W,t2,k2); % 計算t2,k2之間的最短路 dt1=d1+d2+d3; [p4 d4]=n2shorf(W,k1,t2); % 計算k1,t2之間的最短路 [p5 d5]=n2shorf(W,t2,t1); % 計算t2,t1之間的最短路 [p6 d6]=n2shorf(W,t1,k2); % 計算t1,k2之間的最短路 dt2=d4+d5+d6; % 比較兩個和值 if dt1<dt2 d=dt1; P=[p1 p2(2:length(p2)) p3(2:length(p3))]; else d=dt2; P=[p4 p5(2:length(p5)) p6(2:length(p6))]; end P; d;
檢驗一下
clc W=[0 1 inf 2 inf 6; 2 0 4 inf inf inf; inf 3 0 inf inf 2; inf 1 inf 0 3 inf; inf inf inf 2 0 1; inf inf 3 inf 1 0]; %有向圖始點為3終點為4,必須經過1、6兩點 k1=3; k2=4; t1=1; t2=6; [P d]=cn2shorf(W,k1,k2,t1,t2)
運行結果:
P = 3 6 5 4 2 1 1 4 d = 10