我眼中 迪杰斯特拉(Dijkstra)与 普雷姆 (prim)的 区别
2016-07-20 14:52
204 查看
直接上代码:
从上两图中可以知道,不同点及解释就在我做标记的地方。
迪杰斯特拉:
求的是一点到另一点的最短距离。属于单源点问题。
普雷姆:
求最小生成树,求的是一堆的点,就是任意两点的距离的总和。
因此最小生成树中从一点到另一点的距离不一定是最短的。
void dijistra() { memset(vis,0,sizeof(vis)); for(int i=0;i<n;++i) dist[i]=map[0][i]; vis[0]=1; int u=0; for(int i=0;i<n-1;++i) { int mins=1e8; for(int j=0;j<n;++j) { if(dist[j]<mins&&!vis[j]) { mins=dist[j]; u=j; } } if(vis[u]) continue; vis[u]=1; for(int j=0;j<n;++j) { if(dist[j]>map[u][j]+dist[u]) //从出发点(先到u的距离最短距离)到j的距离可以缩短; dist[j]=map[u][j]+dist[u]; } } }
void prim() { memset(vis,0,sizeof(vis)); for(int i=0;i<n;++i) dist[i]=map[0][i]; vis[0]=1; int u=0; for(int i=0;i<n-1;++i) { int mins=1e8; for(int j=0;j<n;++j) { if(dist[j]<mins&&!vis[j]) { mins=dist[j]; u=j; } } if(vis[u]) return; vis[u]=1; for(int j=0;j<n;++j) { if(dist[j]>map[u][j]) //从u点到j的距离可以缩短; dist[j]=map[u][j]; } } }
从上两图中可以知道,不同点及解释就在我做标记的地方。
迪杰斯特拉:
求的是一点到另一点的最短距离。属于单源点问题。
普雷姆:
求最小生成树,求的是一堆的点,就是任意两点的距离的总和。
因此最小生成树中从一点到另一点的距离不一定是最短的。
相关文章推荐
- Mac快捷键(博客待整理)
- iOS开发UI篇-CALayer创建图层
- 自定义控件2
- android产品研发(十三)-->App轮询操作
- 矩阵乘法
- 存储过程和函数
- 1166-敌兵布阵-单点更新
- 【日常练习】HDU 1003 Max Sum
- HDU #5733 tetrahedron
- HttpUtility.UrlDecode
- MVC筛选自定义属性下拉表
- exec与 exec "sp_executesql" 的用法
- Eclipse 中查找
- HDU 5384 Tire树,我也不知道为什么不会MLE
- 《信息学奥赛一本通》例9.13 庆功会
- 阻抗匹配
- 三维摄像头sdk用户指南
- 视图
- php样例
- AndroidStudio安装步骤