一句话概括Prim和Dijkstra:

Dijkstra:依次找距离起点从近到远的点;
Prim:从起点开始找距离最近的点,且不形成环。

这样表述还看不出来什么

我们先对比二者的代码:

def dijkstra2(graph,start):vnum = len(graph)pqueue = []heapq.heappush(pqueue,(0.0,None,start))paths = {vertex : None for vertex in graph}count = 0while count < vnum and pqueue:pair = heapq.heappop(pqueue)distance = pair[0]parent = pair[1]vertex = pair[2]if paths[vertex]:continuepaths[vertex] = (parent,distance)edges = graph[vertex]for v in edges:if paths[v] is None:heapq.heappush(pqueue,(distance + graph[vertex][v],vertex,v))count += 1return paths
#%%
def prim(graph,start): vnum = len(graph)pqueue = []heapq.heappush(pqueue,(0.0,None,start))mst = {vertex : None for vertex in graph}count = 0   while count < vnum and pqueue:pair = heapq.heappop(pqueue)dist = pair[0]parent = pair[1]vertex = pair[2]if mst[vertex]:continuemst[vertex]=(parent,dist)edges = graph[vertex]for v in edges:if mst[v] is None:heapq.heappush(pqueue,(graph[vertex][v],vertex,v))count += 1return mst

AMAZING,看到了没有,简直一模一样!!!!!
只不过压堆时,一个压的是边的距离,一个压的是到起点的距离。

所以我们还要继续思考:Prim和Dijkstra

从起点VertexstartVertex_{start}Vertexstart​,到距离这个点最远的点VertexendVertex_{end}Vertexend​, 之间的路径我们暂且叫PATHPATHPATH。
Dijkstra实际上是在找这个PATHPATHPATH的最小值,不止最远的点找了,其他点也都找了;
Prim一直再找最近的点,也就是边最短的点,直到找了n-1条边,实际上是在约束条件下(不成环)找走过边和最短的PATHPATHPATH,实际上最短PATHPATHPATH也是不可能有环的,加入有环肯定是绕路了(从这里可以看得出算法的基础是数学,好的算法和数学关系很大);
Dijkstra实际上是在找最远点PATHPATHPATH的最小值,等价于,从起始点,约束条件下不断加最短边,直到加n-1条边。
也就是他们在解决同一个问题。

但是这个还是没有反映出他们的代码为何一模一样,简直是兄弟?

1、图类问题的遍历都是借助于邻居辐射,一传十,十传百,根本就不怕扩算乱了,因为已经做了标记处理了,所以框架都差不多;
2、都是基于贪心的处理,用了堆数据结构,基于的标准不一样(这个不一样成了他们的唯一不一样了);
3、为了记录路径,都用到(parent,node, weight),这也是路径的一般处理方式;
4、他们算法都太简单了(懂了的情况下),没几行,所以就没啥差异了啊。

Prim和Dijkstra居然写起来一模一样相关推荐

  1. ACM模板--邻接矩阵 无向图 Prim Kruskal Dijkstra

    /*** C++: Dijkstra算法获取最短路径(邻接矩阵)** @author skywang* @date 2014/04/24*/#include <iomanip> #incl ...

  2. ACM模板--邻接表 无向图 Prim Kruskal Dijkstra

    /*** C++: Dijkstra算法获取最短路径(邻接表)** @author judyge* @date 2014/04/24*/#include <iomanip> #includ ...

  3. Prim和Dijkstra算法的区别

    在图论中,Prim算法是计算最小生成树的算法,而Dijkstra算法是计算最短路径的算法.二者看起来比较类似,因为假设全部顶点的集合是V,已经被挑选出来的点的集合是U,那么二者都是从集合V-U中不断的 ...

  4. cs61b学习记录(四)Trie、KDTree、Prim、Dijkstra、Kruskul

    cs61b学习记录(四) Lecture21.Prefix Operations and Tries Balanced Search Tree: contains(x): Θ(logN) add(x) ...

  5. 经典算法研究系列:二、Dijkstra 算法初探

    经典算法研究系列:二.Dijkstra 算法初探  July   二零一一年一月 ====================== 本文主要参考:算法导论 第二版.维基百科. 写的不好之处,还望见谅. 本 ...

  6. api怎么写_API数据加密框架monkeyapiencrypt

    之前有写过一篇加密的文章<前后端API交互如何保证数据安全性>. 主要是在Spring Boot中如何对接口的数据进行自动加解密操作,通过注解的方式来指定是否需要加解密. 原理也很简单,通 ...

  7. Kruskal Prim模板

    1. Kruskal(并查集模板): /*Kruskal:并查集实现,记录两点和距离,按距离升序排序,O (ElogE) */ struct Edge {int u, v, w;bool operat ...

  8. 和我一起写矩阵类(一)

    和我一起写矩阵类(一) 大连理工大学软件学院WAKU(转载请保留署名) 最近Mr.Zeng的一个作业就是自己实现一个矩阵类,这是一个非常有实用价值的类.我花了几天完成了,期间也增长了很多知识,不敢独享 ...

  9. 图论最短路及生成树(Prim,Djikstra,Spfa,Bellan-ford,kruskal,topsort)

    图论在算法中具有举足轻重的地位,只有学好图才能游刃有余.本文章将介绍图论中一些基础算法,可以说总结的十分全面,文章结尾也会分析各算法的差异,清晰易懂.并附上代码模板. 图论(最短路.生成树) 一.拓扑 ...

最新文章

  1. oracle rac ora 12537,解决11gR2 Rac ORA-12537: TNS:connection closed 一例
  2. android 颜色值参考,(有颜色图
  3. C++primer 10.6节练习
  4. 嵌入式Linux学习1——Linux常用指令1
  5. spring boot security ajax_Spring 和 SpringBoot 之间到底有啥区别?
  6. 偏最小二乘 非线性 matlab,求助:Matlab偏最小二乘程序哪错了
  7. oracle 分段函数,清华大学出版社-图书详情-《新高考数学题型全归纳(基础版)》...
  8. .Net Core2.*学习手册
  9. LeetCode 1694. 重新格式化电话号码(模拟)
  10. 问君能有几多愁,恰似不懂Linux SQL如何调优——聊聊SQL Server on Linux最佳实践
  11. vue checkbox双向绑定_Vue的双向绑定
  12. 转:c# 安装包制作
  13. 初中计算机期末质量分析,初中信息技术教学感悟随笔
  14. 微信登录显示网页无法连接服务器地址,手机微信登陆不了?
  15. 大数据自学全套教程,免费分享,赶紧码起来!(纯干货系列)
  16. 电力电子 中英 对照
  17. 时光飞逝,博客两周年啦
  18. R语言中predict函数之logistic建模
  19. 单片机C语言流水灯花样编程,单片机C语言程序设计:花样流水灯
  20. 《老鹰抓小鸡》将代表中国动画电影走出国门,走向世界,yyds❤

热门文章

  1. 计算机省赛教案,《计算机系统的组成》最新 参赛教案.doc
  2. api可以主动采集用户数据吗_模拟量数字量采集卡之EC-8001篇
  3. :/index.php,http://localhost/my/INDEX.PHP/INDEX/INDEX无法正常运行:解决时找不到Options FollowSymLinks谢谢...
  4. vue搜索好友_Vue实现类似通讯录功能(中)
  5. 抖音提示需要转换为mp4_如何将MP4文件转换为MP3格式?万兴优转帮你轻松完成转换...
  6. mysql扩展使用_mysql的扩展应用
  7. git拉取代码如何解决冲突_开源项目 git pull 代码冲突的解决方式?
  8. 【uniapp】 下拉刷新页面
  9. java string类型时间段 转换 date类型
  10. H2Database 转义符