• 图论中最短路算法与程序实现


    图论中的最短路问题(包括无向图和有向图)是一个基本且常见的问题。主要的算法有Dijkstras算法和Floyd算法。

    Dijkstra算法是求出指定两点之间的最短路,算法复杂度O(n^2)

    Floyd算法是求出任意两点之间的最短路,算法复杂度O(n^3)

    2.Floyd算法

    1)根据已知的部分节点之间的链接信息,建立初始矩阵B(i,j),其中没有给出距离的赋予一个充分大数值,以便于更新。

    2)进行迭代计算。对任意两点(i,j),如存在k,使B(i,k)+B(k,j)<B(i,j),则更新B(i,j)=B(i,k)+B(k,j)

    3)直到所有点距离不再更新,停止计算,得到最短路距离矩阵B(i,j)

    算法程序(Matlab)为:

    for k=1:n
     for i=1:n
      for j=1:n
          t=B(i,k)+B(k,j);
          if t<B(i,j) B(i,j)=t;
         end
       end
      end
    end

    已知50个点之间相互连接信息,求最短距离矩阵。

    n=50;%Matlab实现的Floyd算法
    A=zeros(n,n);
    for i=1:n
        for j=1:n
            if(i==j) 
                A(i,j)=0;
            else
                A(i,j)=100000;
            end
        end
    end %赋直接距离信息
    A(1,2)=400;A(1,3)=450; A(2,4)=300;A(2,21)=230; A(2,47)=140;A(3,4)=600;
    A(4,5)=210;A(4,19)=310;A(5,6)=230;A(5,7)=200; A(6,7)=320; A(6,8)=340;
    A(7,8)=170;A(7,18)=160;A(8,9)=200;A(8,15)=285; A(9,10)=180; A(10,11)=150;
    A(10,15)=160; A(11,12)=140; A(11,14)=130; A(12,13)=200; A(13,34)=400;
    A(14,15)=190;A(14,26)=190; A(15,16)=170; A(15,17)=250; A(16,17)=140;
    A(16,18)=130; A(17,27)=240; A(18,19)=204; A(18,25)=180; A(19,20)=140;
    A(19,24)=175; A(20,21)=180; A(20,24)=190; A(21,22)=300; A(21,23)=270;
    A(21,47)=350;A(22,44)=160;A(22,45)=270;A(22,48)=180;A(23,24)=240;
    A(23,29)=210;A(23,30)=290;A(23,44)=150;A(24,25)=170;A(24,28)=130;
    A(26,27)=140;A(26,34)=320;A(27,28)=190;A(28,29)=260;A(29,31)=190;
    A(30,31)=240;A(30,42)=130;A(30,43)=210;A(31,32)=230;A(31,36)=260;
    A(31,50)=210;A(32,33)=190;A(32,35)=140;A(32,36)=240;A(33,34)=210;
    A(35,37)=160;A(36,39)=180;A(36,40)=190;A(37,38)=135;A(38,39)=130;
    A(39,41)=310;A(40,41)=140;A(40,50)=190;A(42,50)=200;A(43,44)=260;
    A(43,45)=210;A(45,46)=240;A(46,48)=280;A(48,49)=200;
    for j=1:n
        for i=1:j-1
            A(j,i)=A(i,j);%使矩阵对称
        end
    end
    B=A;
    %利用Floyd算法计算最短距离矩阵
    for k=1:n
        for i=1:n
            for j=1:n
                t=B(i,k)+B(k,j);
                if t<B(i,j) 
                    B(i,j)=t; 
                end
            end
        end
    end
    %输出距离矩阵到文件
    fid=fopen('distance.txt','w');
    for i=1:n
        for j=1:n
            fprintf(fid,'%6d',B(i,j));
        end
        fprintf(fid,'
    ');
    end
    fclose(fid);

    原文链接:https://www.icourse163.org/

    交流请关注个人微信公众号:dankekang

  • 相关阅读:
    软件需求阅读笔记02
    软件需求阅读笔记01
    搜狗输入法
    冲刺周之后感想
    典型用户分析和场景
    四则运算
    学习总结
    2019年春阅读笔记5——对开源的认知
    2019年春阅读笔记4——分布式消息系统的现状、挑战与未来
    2019年春阅读笔记3——数据库集群方案
  • 原文地址:https://www.cnblogs.com/kmxojer/p/12246616.html
Copyright © 2020-2023  润新知