代码来源:《图论算法及其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
时间: 2024-10-28 15:30:37