图的相关算法也算是自己的一个软肋了,当年没选修图论也是一大遗憾。

图像处理中,也有使用图论算法作为基础的相关算法,比如图割,这个算法就需要求最大流、最小割。所以熟悉一下图论算法对于图像处理还是很有帮助的。

Dijkstra和Bellman-Ford类似,都是解决单源最短路径问题,不同的是这个方法只能解决边为非负的问题,实现的好的Dijkstra算法运行时间要快于Bellman-ford。

算法步骤如下:

1.首先设置队列,所有节点入列,源节点值为0,其他节点值为无穷。

2.然后在队列中找值最小的节点并出列。

3.计算出列的节点所有后继节点的距离。

4.松弛方法,如果新计算的距离小于上次计算的距离,那么更新距离,即将后继节点值设为较小的距离,并将后继节点的前趋设为当前的出列节点。

5.对剩余的节点队列继续找最小值并出列,不断循环2、3、4步直到队列中没有节点了。

步骤是上面没错,不过我程序中没有完全按照上述的步骤实现。不同的地方在于我没有做出列操作,而是通过标记节点的形式实现的。

运行结果如下,图(是图不是图片)是算法导论367页上的:

matlab代码如下,netplot和compresstable2matrix和上一篇使用的一样:

main.m

clear all;close all;clc
%初始化邻接压缩表, 表示从节点1到节点2,边的权重为10
b=[ ; ; ;
; ; ;
; ; ;
]; m=max(max(b(:,:))); %压缩表中最大值就是邻接矩阵的宽与高
A=compresstable2matrix(b); %从邻接压缩表构造图的矩阵表示
netplot(A,) %形象表示 S=inf(,m); %从开始的源点到每一个节点的距离
S()=; %源点到自己的距离为0
pa=zeros(,m); %存储每个节点的前驱,在松弛过程中赋值
pa(1)=1;       %源点的前趋是自己 
visit=zeros(,m); %标记某个节点是否访问过了
index=; %从index节点开始搜索 %判断是否对所有节点都找的最短路径了。可能会有源点没有路径到目标节点的情况,那就无限循环了
while sum(visit)~=m %没有出队列操作,不过通过visit来等价的表示了 visit(index)=; %标记第index节点为已入列的节点
[S pa]=relax(S,pa,A,visit,index,m); %松弛,如果两个节点间有更短的距离,则用更短的距离
index=extract_min(S,visit,index,m); %使用已访问的最小的节点作为下一次搜索的开始节点 end
%最终我们需要的就是这两个值
S %源点到其他每一点的距离
pa %其他每一节点的前趋 %算法到此结束,下面只是为了形象的表示而写的。
re=[];
for i=:m
re=[re;pa(i) i A(pa(i),i)];
end
A=compresstable2matrix(re); %从邻接压缩表构造图的矩阵表示
figure;
netplot(A,) %形象表示

relax.m

%边缘松弛,使用更短的距离作为节点的值
function [S pa]=relax(S,pa,A,visit,index,m) i=index;
for j=:m
if A(i,j)~=inf && visit(j)~= %搜索没有标记过的节点
if S(j)>S(i)+A(i,j) %将较小的值赋给正在搜寻的节点
S(j)=S(i)+A(i,j);
pa(j)=i;
end
end
end end

extract_min.m

%提取队列中尚未标记的最小的值的序号
function index=extract_min(S,visit,index,m) Mi=inf;
for j=:m
if visit(j)~=
if S(j)<Mi
Mi=S(j);
index=j;
end
end
end end

matlab练习程序(单源最短路径Dijkstra)的更多相关文章

  1. 单源最短路径Dijkstra算法,多源最短路径Floyd算法

    1.单源最短路径 (1)无权图的单源最短路径 /*无权单源最短路径*/ void UnWeighted(LGraph Graph, Vertex S) { std::queue<Vertex&g ...

  2. 单源最短路径——dijkstra算法

    dijkstra算法与prim算法的区别   1.先说说prim算法的思想: 众所周知,prim算法是一个最小生成树算法,它运用的是贪心原理(在这里不再证明),设置两个点集合,一个集合为要求的生成树的 ...

  3. 单源最短路径 dijkstra算法实现

    本文记录一下dijkstra算法的实现,图用邻接矩阵表示,假设图为无向图.而且连通,有向图,不连通图的做法相似. 算法简述: 首先确定"单源"的源.假设是第0个顶点. 维护三个数组 ...

  4. [数据结构与算法-15]单源最短路径(Dijkstra+SPFA)

    单源最短路径 问题描述 分别求出从起点到其他所有点的最短路径,这次主要介绍两种算法,Dijkstra和SPFA.若无负权优先Dijkstra算法,存在负权选择SPFA算法. Dijkstra算法 非负 ...

  5. 单源最短路径-Dijkstra算法

    1.算法标签 贪心 2.算法描述 具体的算法描述网上有好多,我觉得莫过于直接wiki,只说明一些我之前比较迷惑的. 对于Dijkstra算法,最重要的是维护以下几个数据结构: 顶点集合S : 表示已经 ...

  6. 单源最短路径——Dijkstra算法学习

    每次都以为自己理解了Dijkstra这个算法,但是过没多久又忘记了,这应该是第4.5次重温这个算法了. 这次是看的胡鹏的<地理信息系统>,看完之后突然意识到用数学公式表示算法流程是如此的好 ...

  7. 洛谷P3371单源最短路径Dijkstra堆优化版及优先队列杂谈

    其实堆优化版极其的简单,只要知道之前的Dijkstra怎么做,那么堆优化版就完全没有问题了. 在做之前,我们要先学会优先队列,来完成堆的任务,下面盘点了几种堆的表示方式. priority_queue ...

  8. 洛谷P3371单源最短路径Dijkstra版(链式前向星处理)

    首先讲解一下链式前向星是什么.简单的来说就是用一个数组(用结构体来表示多个量)来存一张图,每一条边的出结点的编号都指向这条边同一出结点的另一个编号(怎么这么的绕) 如下面的程序就是存链式前向星.(不用 ...

  9. 单源最短路径Dijkstra和优先级算法

    百度百科:迪杰斯特拉算法. 代码实现如下: import java.util.Comparator; import java.util.PriorityQueue; import java.util. ...

随机推荐

  1. [BZOJ 5415] 归程

    一棵KrusKal重构树,然而我数组开小了,忘记清空一个标记 洛谷传送门 BZOJ传送门 ......好像成权限题了Orz 回顾我们用KrusKal做生成树的时候,我们将边排序后连通各个连通块,那么边 ...

  2. docker: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled (Client.Timeout exceeded while awaiting headers).

    docker: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled ...

  3. 未在本地计算机上注册microsoft.jet

      未在本地计算机上注册microsoft.jet http://www.microsoft.com/zh-cn/download/confirmation.aspx?id=13255

  4. HDOJ3085 Nightmare II 双向BFS

    重构一遍就A了...但这样效率太低了...莫非都要重构???QWQ 每一秒男同志bfs3层,女同志bfs1层.注意扩展状态时,要判一下合不合法再扩展,而不是只判扩展的状态合不合法,否则有可能由非法的走 ...

  5. POJ - 1733 离散化 并查集

    题意:求问数列区间奇偶信息正确与否 和上一题一样(甚至弱化),加个离散就ok啦 #include<iostream> #include<algorithm> #include& ...

  6. UESTC - 1607 ad-hoc

    #include<bits/stdc++.h> #define rep(i,j,k) for(register int i=j;i<=k;i++) using namespace s ...

  7. 文本编辑器 未完成 Treap

    #include<bits/stdc++.h> using namespace std; const int maxn = 2e6+1e5; unsigned int SEED = 17; ...

  8. openssl-devel和openssl 是什么具体关系

    [转自] https://zhidao.baidu.com/question/919579491101051499.html Redhat在封装openssl的时候,把openssl分成了几个部分,执 ...

  9. 剑指offer——面试题14:剪绳子

    // 面试题14:剪绳子 // 题目:给你一根长度为n绳子,请把绳子剪成m段(m.n都是整数,n>1并且m≥1). // 每段的绳子的长度记为k[0].k[1].…….k[m].k[0]*k[1 ...

  10. win10 sshsecureshellclient删除profile保存的信息

    C:\Users\joe\AppData\Roaming\SSH