【最短路】必须通过两个指定点的最短路径算法及其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

时间: 2024-10-28 15:30:37

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

php日期处理汇总,指定日期加减多少天,循环两个指定日期之间的日期

一. (1)指定日期加减多少天 (2)循环两个指定日期之间的日期 例: $start_time = '2017-07-01';$end_time = '2017-07-10'; 获取时间差 $diff= strtotime($end_time)-strtotime($start_time);$num = $diff/(24*60*60)+1; for ($i=0; $i < $num; $i++) { $selectTime = date("Y-m-d",strtotime(&q

【最短路】求最大可靠路的算法及其matlab实现

内容来源:<图论算法及其matlab实现>(北京航空航天出版社) P34 [算法用途] 求图中两顶点间的最大可靠路. 代码如下: 1 %最大可靠路的算法 2 %调用Floyd文件 3 function [P p f]=p_pathf(A) 4 %f=0表示找到路,否则f=1 5 %初始化 6 7 [m n]=size(A); 8 f=0; 9 B=zeros(m,n); 10 %对原矩阵进行转换 11 for i=1:m 12 for j=1:n 13 if A(i,j)>0&A

【最短路】求两点间最短路的Floyd算法及其matlab实现

代码来源:<图论算法及其matlab实现>(北京航空航天出版社) P22 此代码返回第一个点和最后一个点之间最短路径,以及最短路径的长度. 代码如下: 1 function [P,u ] = Floyd(W) 2 %W表示权值矩阵 3 %P表示最短路径 4 %u表示最短路的权和 5 n=length(W); 6 U=W; 7 m=1; 8 9 while m<=n %判断是否满足停止条件 10 for i=1:n 11 for j=1:n 12 if U(i,j)>U(i,m)+U

【最短路】求两点间最短路径的改进的Dijkstra算法及其matlab实现

代码来源:<图论算法及其matlab实现>(北京航空航天出版社) P18 书中提出了基于经典Dijkstra算法改进的两种算法. 其中算法Ⅱ的效率较高. 代码如下: 1 function a=Dijk(a) 2 %a(输入量)表示图的邻接矩阵 3 %a(输出量)表示所求最短路径的距离矩阵 4 5 %建立邻接矩阵,若不还是对称矩阵,则变为对称矩阵 6 n=length(a); 7 for i=2:n 8 for j=1:(i-1) 9 a(i,j)=a(j,i); 10 end 11 end 1

PHP截取两个指定字符中间的字符

实现的方法有很多种,在不考虑执行效率的情况下,这里贴出来一个最小白,但是最容易懂的方法: <?php $a = "[email protected]#456"; $b= (strpos($a,"@")); $c= (strpos($a,"#")); echo substr($a,$b+1,$c-1); ?> 输出:abc,比起VB要简单了那么一点点啊,php很强大.

截取一段字符串中,两个指定字符串中间的字符串

NSString *textStr = @"系统将于2017年4月20日17~19点间进行升级,在升级期间系统将停止使用,请你提前处理系统中待处理任务."; NSRange startRange = [textStr rangeOfString:@"于"]; NSRange endRange = [textStr rangeOfString:@"点"]; NSRange range = NSMakeRange(startRange.locatio

将两个数字逆序输出算法构思

编写一个程序,要求用户输入一个两位整数,然后逆序打印出来: 1. 构思: 使用算术分割实现 1.1 实现方法:设输入的数为N,N%10位个位数,N / 10 位十位数   推广:编写一个程序,要求用户输入三位整数,逆序打印出来: 实现方法:设输入的数为ABC:先从ABC中取出一个两位数(AB或BC或AC),然后用算术分割法实现逆序打印,设先取出的数为BC(BC = ABC % 100),再将BC分离(B = BC / 10 ; C = BC % 10);在将A取出(A = ABC / 100):

对比两个文件相似度 余弦算法

文件A1 包含字符Bi 的个数BiN1,文件A2 包含的字符Bi 的个数BiN2 利用余弦算法:   相似度 = (B1N1*B1N2 +B2N1*B2N2+....+BiN1*BiN2)/(Math.sqrt(B1N1^2 +B2N1^2+....+BiN1^2)*Math.sqrt(B1N2^2 +B2N2^2+....+BiN2^2). Math.sqrt() 代表开方. 具体代码如下: public class SimilarDegreeByCos { /* * 计算两个字符串(英文字符

php取两个整数的最大公约数算法大全

php计算两个整数的最大公约数常用算法 <?php//计时,返回秒function microtime_float (){ list( $usec , $sec ) = explode ( " " , microtime ()); return ((float) $usec + (float) $sec );}////////////////////////////////////////////欧几里得算法function ojld($m, $n) { if($m ==0 &a