zoukankan      html  css  js  c++  java
  • 最短路径算法[2019.5.25]

    题目:

      实现单源最短路经的迪杰斯特拉算法(Dijkstra),以下图为例,求出1到其余地点的最短路径。

      

    基本思想:

      以起始点为中心向外层层扩展,直到扩展到终点为止。

    Code:

    clc
    clear
    % 作出邻接矩阵
    a=zeros(7);
    a(1,2)=10;a(1,3)=15;a(1,4)=30;
    a(2,5)=45;a(2,7)=60;
    a(3,4)=10;a(3,6)=25;
    a(4,6)=20;a(4,7)=23;
    a(5,7)=29;
    a(6,7)=11;
    a=a+a'
    % 将a=0的数替换为∞
    a(find(a==0))=inf
    % 当一个点已经求出到原点的最短距离时,其下标i对应的pb(i)赋1
    pb(1:length(a))=0;
    pb(1)=1;
    % 存放存入S集合的顺序
    index1=1; 
    % 存放起点到第i点最短通路中第i顶点前一顶点的序号
    index2=ones(1,length(a));
    
    % d存放由始点到第i点最短通路的值
    d(1:length(a))=inf;
    d(1)=0;  
    % temp表示c1,算c1到其它点的最短路。
    temp=1;  
    % 看是否所有的点都标记为P标号
    while sum(pb)<length(a)  
    % 找到标号为0的所有点,即找到还没有存入S的点
    tb=find(pb==0); 
    % 计算标号为0的点的最短路,或者是从原点直接到这个点,又或者是原点经过r1,间接到达这个点
    d(tb)=min(d(tb),d(temp)+a(temp,tb));
    % 求d[tb]序列最小值的下标
    tmpb=find(d(tb)==min(d(tb)));  
    % 可能有多条路径同时到达最小值,却其中一个,temp也从原点变为下一个点
    temp=tb(tmpb(1));
    % 找到最小路径的表对应的pb(i)=1
    pb(temp)=1;
    % 存放存入S集合的顺序
    index1=[index1,temp];  
    temp2=find(d(index1)==d(temp)-a(temp,index1));
    % 记录标号索引
    index2(temp)=index1(temp2(1)); 
    end
    d, index1, index2

    输出结果

       0    10    15    25    55    40    48   为到各点的最短距离

  • 相关阅读:
    centos7 使用postgres
    centos7 Authentication failure
    centos 安装 jdk PostgreSQL
    JS遍历对象或者数组
    PHP简单 对象(object) 与 数组(array) 的转换
    IDEA 配置Tomcat 跑Jeecg项目
    kettle 安装mysql 驱动
    : Could not open a connection to your authentication agent
    java_Ninja实战过程
    设备判断
  • 原文地址:https://www.cnblogs.com/cruelty_angel/p/11021939.html
Copyright © 2011-2022 走看看