zoukankan      html  css  js  c++  java
  • 多源最短路Floyd 算法————matlab实现

    弗洛伊德(Floyd)算法是一种用于寻找给定的加权图中顶点间最短路径的算法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。


    基本思想

         通过Floyd计算图G=(V,E)中各个顶点的最短路径时,需要引入一个矩阵S,矩阵S中的元素a[i][j]表示顶点i(第i个顶点)到顶点j(第j个顶点)的距离。

         假设图G中顶点个数为N,则需要对矩阵S进行N次更新。初始时,矩阵S中顶点a[i][j]的距离为顶点i到顶点j的权值;如果i和j不相邻,则a[i][j]=∞。 接下来开始,对矩阵S进行N次更新。第1次更新时,如果"a[i][j]的距离" > "a[i][0]+a[0][j]"(a[i][0]+a[0][j]表示"i与j之间经过第1个顶点的距离"),则更新a[i][j]为"a[i][0]+a[0][j]"。 同理,第k次更新时,如果"a[i][j]的距离" > "a[i][k]+a[k][j]",则更新a[i][j]为"a[i][k]+a[k][j]"。更新N次之后,操作完成!

         matlab代码函数如下:

    function [dist,mypath]=myfloyd(a,sb,db);
    % 输入:a—邻接矩阵(aij)是指i 到j 之间的距离,可以是有向的
    % sb—起点的标号;db—终点的标号
    % 输出:dist—最短路的距离;% mypath—最短路的路径
    n=size(a,1); path=zeros(n);
    for i=1:n
    for j=1:n
    if a(i,j)~=inf
    path(i,j)=j; %j 是i 的后续点
    end
    end
    end
    for k=1:n
    for i=1:n
    for j=1:n
    if a(i,j)>a(i,k)+a(k,j)
    a(i,j)=a(i,k)+a(k,j);
    path(i,j)=path(i,k);
    end
    end
    end
    end
    dist=a(sb,db);
    mypath=sb; t=sb;
    while t~=db
    temp=path(t,db);
    mypath=[mypath,temp];
    t=temp;
    end
    return
    

      

  • 相关阅读:
    【Linux 读书笔记】Linux文件的硬连接和符号连接
    Shell参数
    Shellcase语句的例子
    Shellselect
    Shell小程序一个
    SHELL起步
    接昨天的 while
    Shell循环控制
    Shellwhile循环的例子
    Shellfor语句
  • 原文地址:https://www.cnblogs.com/renqiqiang/p/5791225.html
Copyright © 2011-2022 走看看