图论学习笔记——Dijkstra(广度优先)

1.Dijkstra(广度优先)

Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。注意该算法要求图中不存在负权边。
问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径。(单源最短路径)

2.算法描述

算法思想:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。
(1) 初始时,S只包含起点s;U包含除s外的其他顶点,且U中顶点的距离为"起点s到该顶点的距离"[例如,U中顶点v的距离为(s,v)的长度,然后s和v不相邻,则v的距离为∞]。
(2) 从U中选出"距离最短的顶点k",并将顶点k加入到S中;同时,从U中移除顶点k。
(3) 更新U中各个顶点到起点s的距离。之所以更新U中顶点的距离,是由于上一步中确定了k是求出最短路径的顶点,从而可以利用k来更新其它顶点的距离;例如,(s,v)的距离可能大于(s,k)+(k,v)的距离。
(4) 重复步骤(2)和(3),直到遍历完所有顶点。
图论学习笔记——Dijkstra(广度优先)_第1张图片
图论学习笔记——Dijkstra(广度优先)_第2张图片

图论学习笔记——Dijkstra(广度优先)_第3张图片
图论学习笔记——Dijkstra(广度优先)_第4张图片

图论学习笔记——Dijkstra(广度优先)_第5张图片
图论学习笔记——Dijkstra(广度优先)_第6张图片
图论学习笔记——Dijkstra(广度优先)_第7张图片
MATLAB实验代码

function [d index1 index2]=Dijkf(a)
M=max(max(a));
pb(1:length(a))=0;
pb(1)=1;
index1=1;
index2=ones(1,length(a));
d(1:length(a))=M;
d(1)=0;
temp=1;
while sum(pb)<length(a)
    tb=find(pb==0);
d(tb)=min(d(tb),d(temp)+a(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)-a(temp,index1)));
if length(index)>=2
        index=index(1);
    end
    index2(temp)=index;
end
d;
index1;
index2;
 

图论学习笔记——Dijkstra(广度优先)_第8张图片
d表示起点A到各个顶点之间的最段距离,以邻接矩阵的顶点的顺序算

index1最短距离的顺序

Index2索引

比如A到D的距离
A B C D E F G
2 3 4 5 6 7
D前面经过5,也就是E,E前面是6,也就是F,F前面是1,也就是A
A-F-E-D
求任意两点之间的最短距离的实验代码

function D=shortdf(W)
n=length(W);
D=W;
m=1;
while m<=n
    for i=1:n
    for j=1:n
        if D(i,j)>D(i,m)+D(m,j)
            D(i,j)=D(i,m)+D(m,j);
        end
    end
end
m=m+1;
end
D;

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