Matlab--最短路问题

function [d index1 index2] = Dijkf_one(a)
%a表示图的权值矩阵
%d表示所求最短路的权和  (即最终结果为答案)
%index1表示标号顶点顺序(顶点先后求解出来的顺序)
%index2表示标号顶点索引(索引的答案可能不唯一)
%参数初始化

M=max(max(a));        %寻找一个矩阵中最大的数
pb(1:length(a))=0;    %记录是否判断历遍所有顶点,1为完成最优解,否则为0
pb(1)=1;              %第一个默认完成(0,0)
index1=1;             %(0,0,)是第一个求出来的顶点
index2=ones(1,length(a)); %开一个一维索引矩阵
d(1:length(a))=M;    %刚开始权和赋值无穷
d(1)=0;
temp=1;
%更新l(v),同时记录顶点顺序和顶点索引
while sum(pb)
    tb=find(pb==0);        %寻找还没有处理的顶点
    d(tb)=min(d(tb),d(temp)+a(temp,tb));   %更新l(v)--d矩阵由近到远逐步更新到最终解
    tmpb = find(d(tb)==min(d(tb))); %记录最小值得位置,返回一个一维矩阵
    temp=tb(tmpb(1));         %最优解的位置,取出第一个
    pb(temp)=1;               %用来记录最优解状态
    index1=[index1,temp];     %记录标号顺序
    index=index1(find(d(index1)==d(temp)-a(temp,index1)));
    if length(index)>=2
        index = index(1);
    end
        index2(temp)=index;    %记录标号索引
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%输入信息检验答案
% a(1,:)=[0 50 10000 40 25 10];
% a(2,:)=[50 0 15 20 10000 25];
% a(3,:)=[10000 15 0 10 20 10000];
% a(4,:)=[40 20 10 0 10 25];
% a(5,:)=[25 10000 20 10 0 55];
% a(6,:)=[10 25 10000 25 55 0];
% [d index1 index2]=Dijkf_one(a)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 输入信息检验答案
 
注:↑这是求最开始的那个顶点V0与其他顶点的最短距离




%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%用法:(1)输入一个完整方阵(双向),不相邻的两条边的距离用
%      inf或10000(代表无穷)表示
%      (2)输入全部相邻的两条边的距离即可。
%           例如:a(i,j)=1  表示顶点i到顶点j的距离为1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function b=my_Dijkf(a)
tic 
n=length(a);
for i=1:n-1
    for j=i:n
        a(j,i)=a(i,j);
    end
end

b=zeros(n);i=1;
while length(Dijkf_one(a))~=1   %判断是否为最后一个数
x=Dijkf(a);                 %调用函数
    for j=1:length(a)       %局部赋值
        b(i,n-length(a)+j)=x(j);
        b(n-length(a)+j,i)=x(j);
    end
    a(1,:)=[];              %删除行
    a(:,1)=[];              %删除列
i=i+1;
end
%↓更新全局结果
for i=2:n
    for j=i+1:n
        for k=1:i-1
            if b(i,k)+b(k,j)
                b(i,j)=b(i,k)+b(k,j);
                b(j,i)=b(i,k)+b(k,j);
            end
        end
    end
end
t=toc;
fprintf('所用时间为:%f\n',t);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%提示输入信息
% a=zeros(12)+1000;
% a(1,2)=5;
% a(2,3)=8;
% a(2,6)=5;
% a(3,4)=3;
% a(3,9)=10;
% a(4,5)=5;
% a(4,7)=3;
% a(5,6)=2;
% a(7,8)=2;
% a(8,9)=4;
% a(8,11)=6;
% a(9,10)=3;
% a(10,11)=5;
% a(10,12)=3;

% a=[0 2 8 1 100 100 100 100;
%    2 0 6 100 1 100 100 100;
%    8 6 0 7 5 1 2 100;
%    1 100 7 0 100 100 9 100;
%    100 1 5 100 0 3 100 8;
%    100 100 1 100 3 0 4 6;
%    100 100 2 9 100 4 0 3;
%    100 100 100 100 8 6 3 0];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%提示输入信息
 
注:↑这是需要调用上面Dijkf_one 函数,使用时,需把上面的两个函数文件放到同一个目录下(这是求任意两个顶点的最短距离哦!)

  

你可能感兴趣的:(数学)