图论05—Dijkstra算法(经典)

========================================================

经典dijkstra算法,已知顶点,求其到其他各个点的最短距离和路径。

========================================================

function [d index1 index2]=Dijkstra(W)

%d-最短距离,index1-路径排序(升),index2-指向来源(上一个点,递归可得路径)

M=max(max(W));

pb(1:length(W))=0;

pb(1)=1;

index1=1;

index2=ones(1,length(W));

d(1:length(W))=M;

d(1)=0;

temp=1;

while sum(pb)<length(W)

    tb=find(pb==0);

    d(tb)=min(d(tb),d(temp)+W(temp,tb));

    tmpb=find(d(tb)==min(d(tb)));

    temp=tb(tmpb(1));

    pb(temp)=1;

    index1=[index1,temp];

    index=index1(find(d(index1)==d(temp)-W(temp,index1)));

    if length(index)>=2

        index=index(1);

    end

    index2(temp)=index;

end

d;

index1;

index2;

========================================================

评:只给出了顶点到其他点的最短距离,路径解不彻底,不能直观表达路径。

========================================================

例:求下图中顶点1到其它点的最短距离。

《图论05—Dijkstra算法(经典)》

解:

(1)写权值矩阵

quanzhijuzhen=[ 0     2     8     1   Inf   Inf   Inf   Inf
     2     0     6   Inf     1   Inf   Inf   Inf
     8     6     0     7     5     1     2   Inf
     1   Inf     7     0   Inf   Inf     9   Inf
   Inf     1     5   Inf     0     3   Inf     8
   Inf   Inf     1   Inf     3     0     4     6
   Inf   Inf     2     9   Inf     4     0     3
   Inf   Inf   Inf   Inf     8     6     3     0]

(2)带入程序(格式整理后输出如下)

>> [d index1 index2]=Dijkstra(quanzhijuzhen)

d =
     0     2     7     1     3     6     9    11

index1 =
     1     4     2     5     6     3     7     8

index2 =
     1     1     6     1     2     5     3     5

说明:

d——顶点1到点1-8的最短距离分别为0     2     7     1     3     6     9    11;

index1——到其他点的距离排序,即1最近(0),4次之(1),后依次为2(2),5(3),6(6),3(7),7(9),8(11);

index2——各点的上游编号,例如到点5的路径可这样推算:index2(5)=2,index2(2)=1(已经到顶点,结束),则路径为1—>2—>5.

        

    原文作者:Dijkstra算法
    原文地址: https://blog.csdn.net/lzx19901012/article/details/47832719
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞