【最短路】必须通过两个指定点的最短路径算法及其matlab实现

代码来源:《图论算法及其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

 

 

 

 

posted @ 2017-09-10 15:09  这是小魔仙的账户  阅读(5829)  评论(0编辑  收藏  举报