Dijkstra算法

1.定义概览

Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。注意该算法要求图中不存在负权边。

问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径。(单源最短路径)

2.算法描述

1)算法思想:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。

2)算法步骤:

a.初始时,S只包含源点,即S={v},v的距离为0。U包含除v外的其他顶点,即:U={其余顶点},若v与U中顶点u有边,则正常有权值,若u不是v的出边邻接点,则权值为∞。

b.从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。

c.以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。

d.重复步骤b和c直到所有顶点都包含在S中。

模板:

const int INF=0x3f3f3f3f;const int maxn=1200;intdist[maxn],g[maxn][maxn],N;boolvis[maxn];voiddijkstra()

{for(int i=1;i<=N;i++)

dist[i]=(i==1)?0:INF;

memset(vis,0,sizeof(vis));for(int i=1;i<=N;i++)

{int mark=-1,mindis=INF;for(int j=1;j<=N;j++)

{if(!vis[j]&&dist[j]

{

mindis=dist[j];

mark=j;

}

}

vis[mark]=1;for(int j=1;j<=N;j++)

{if(!vis[j])

{

dist[j]=min(dist[j],dist[mark]+g[mark][j]);

}

}

}

}

内存优化后的Dijkstra:

intdist[N], point[N], n, m;boolvis[N];

std::vector > g[N];//g[i][j] = 为边(i , fi)的距离se;

voiddijkstra()

{for(int i=1;i<=n;i++)

dist[i]=(i==1)?0:INF;

memset(vis,0,sizeof(vis));for(int i=1;i<=n;i++)

{int mark=-1,mindis=INF;for(int j=1;j<=n;j++)

{if(!vis[j]&&dist[j]

{

mindis=dist[j];

mark=j;

}

}

vis[mark]=1;for(int j=0;j

{if(!vis[g[mark][j].fi])

{

dist[g[mark][j].fi]=min(dist[g[mark][j].fi],dist[mark]+g[mark][j].se);

}

}

}

}

View Code

堆优化后的Dijkstra:

//堆优化dijkstra

voiddijkstra()

{

memset(dist,63,sizeof(dist));

dist[S]=0;

priority_queue q; ///-距离,点

q.push(make_pair(0,S));while(!q.empty())

{

pII tp=q.top(); q.pop();

LL u=tp.second;if(vis[u]==true) continue;

vis[u]=true;for(LL i=Adj[u];~i;i=edge[i].next)

{

LL v=edge[i].to;

LL len=edge[i].len;if(vis[v]) continue;if(dist[v]>dist[u]+len)

{

dist[v]=dist[u]+len;

q.push(make_pair(-dist[v],v));

}

}

}

}

View Code

dijkstra标号法表格_dijkstra算法模板及其用法相关推荐

  1. dijkstra标号法表格_Dijkstra算法详细讲解

    最短路径之 Dijkstra 算法详细讲解 1 最短路径算法 在日常生活中,我们如果需要常常往返 A 地区和 B 地区之间,我们最希望 知道的可能是从 A 地区到 B 地区间的众多路径中,那一条路径的 ...

  2. dijkstra标号法表格_狄克斯屈拉dijkstra标号算法.pptx

    狄克斯屈拉dijkstra标号算法 第1页/共10页v5v2v3v1v4标号算法的基本原理回顾如图v1→v2 →v3 →v5是v1 →v5的最短路,则v1 →v2 →v3一定是v1 →v3的最短路,v ...

  3. dijkstra标号法表格_标号法求最短路径例题详解.ppt

    标号法求最短路径例题详解 r * 最短路径 带权图G=, 其中w:E?R. ?e?E, w(e)称作e的权. e=(vi,vj), 记w(e)=wij . 若vi,vj不 相邻, 记wij =?. 设 ...

  4. 指定起终点的最短路算法-Dijkstra标号法及其改进

    源代码来源于司守奎老师<数学建模与算法>,本人加了一些注释供大家参考: function [mydistance,mypath]=mydijkstra(a,sb,db); % 输入:a-邻 ...

  5. 最短路问题 Dijkstra标号法

    http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html http://www.61mon.com/index.php/ar ...

  6. 标号法(label-setting algorithm)求解带时间窗的最短路问题(ESPPRC)

    以下文章来源于数据魔术师 ,作者邓发珩.周航 前言 哈罗大家好~! 想必大家在刚开始学习运筹学模型时,会觉得有些茫然不知所措吧?比如一大堆神奇的名词,各种各样的约束...反正我一开始是很懵的状态. 那 ...

  7. 最短路标号法python_例题 最短路的标号法 -

    例题 最短路的标号法 例1 用Dijkstra标号法求vs到vt的最短路及最短路线 v2 6 vt 10 2 5 vs 5 12 v4 3 v3 解:i=0,给vs标上( P(vs)?0,?(vs)? ...

  8. 网络最大流中一般增广路算法(标号法)

    网络最大流主要有两大类求解方法:增广路算法和预流推进算法 一般增广路算法:主要分为初始流为零流和初始流为非零流的情况!后者在标号的时候注意一条边是正向连接还是反向连接:若是反向的连接,那么在调整的时候 ...

  9. 网络流算法学习笔记——最大流问题基本概念和Ford-Fulkerson方法(标号法C++实现)

    屈婉玲<算法设计与分析>第2版第7章网络流算法学习笔记. 基本概念 最大流问题,相当于有从s到t的供水系统,每段路径都有限定流量,除了s.t两地外,每个中间点都不能滞留,从s流入多少,就从 ...

最新文章

  1. gpio引脚介绍 树莓派3b_使用微创联合M5S空气检测仪、树莓派3b+、prometheus、grafana实现空气质量持续监控告警WEB可视化...
  2. 使用doctest单元测试方式培训讲解:Python函数基础
  3. 以文件形式导入大批量数据
  4. Spring Cloud –基本设置
  5. 原来访问网页弹出cookie是这样的
  6. 7 款 Python 可视化工具对比
  7. POJ1521 LA2088 HDU1053 ZOJ1117 Entropy【哈夫曼编码】
  8. APP开发难吗?澳大利亚10岁儿童已开发5个手机App
  9. 基于R语言的贝叶斯网络模型的实践技术
  10. 错误:[IM002] [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序 解决方法_QT
  11. 如何DIY一台属于你自己的电脑?
  12. 5角星画法 android,Android Canvas绘制正多边形和正多角星
  13. Vue.js实战:初识Vue.js
  14. “历史的教训”之软件测试
  15. UE4 PBR材质使用记录
  16. Thingworx笔记-创建菜单
  17. 成像数据更好的展示_如何使用数据科学更好地了解您的客户
  18. 正则表达式验证手机号,邮箱
  19. Apache APISIX 扩展指南
  20. eclipse中测试java_在Eclipse中使用JUnit进行单元测试

热门文章

  1. Office 365小型企业版同时安装 Office Project 2016 教程
  2. Ps 初学者教程「63」如何在 Ps 中制作 GIF 动画?
  3. SQLServer按照每小时、半小时分组
  4. python包和库的区别_python中模块、包、库的区别和使用
  5. 数美2022:不惧势,不却步,逐浪有为
  6. 腾讯 Code Review 规范出炉,你还敢乱写代码?
  7. 使用Requests库进行网页爬取
  8. [Git 1]基本操作与协同开发
  9. XFS(dm-0): Internal error XFS_WANT_CORRUPTED_GOTO at line 1664 of file fs/xfs/libxfs/xfs_alloc.c.
  10. C#调用不同.cs文件下数据的方法