Prim算法与Dijkstra算法的联系与区别
/* 图结构,邻接矩阵形式 */
ElemType nodes[n];
int edges[n][n];
prim_or_dijkstra( int index, bool usePrim ) /* 起点 */
{
int dist[n] = { INF }; /* 从起点开始,到其他所有边的距离 */
int distIndex[n] = { - };
int visited[n] = { };
int selected = index; /*选中的点 */
/* 初始化起点的可达边距离 */
for ( i = ; i < nodes.length; i++ )
/* edges[起点][终点]=权重(不是INF就有边),穷举 */
{
if ( visited[i] )
break;
visited[i] = true;
if ( edges[selected][i] != INF )
{
dist[i] = edges[selected][i]; /* index到可达边的距离 */
}
}
for ( k = ; k < nodes.length - ; k++ ) /* n-1次循环取点 */
{
visited[selected] = true;
int min = INF;
int sel = -;
for ( i = ; i < nodes.length; i++ )
/* edges[起点][终点]=权重(不是INF就有边),穷举 */
{
if ( visited[i] )
break; /* 属于同一集合,不必考虑 */
if ( edges[selected][i] != INF )
{
if ( min > dist[i] )
{
min = dist[i]; sel = i;
}
/* min=已经被选中的点的集合到其他单独的点的最短距离 */
/* sel=相应的点 */
}
}
distIndex[sel] = selected; /* sel->selected映射,存放边 */
/* 一个sel只对应一个selected, */
/* 一个selected对应多个sel */
/* 第一次distIndex v2->v1 */
selected = sel; /*选中的点要更新 */
/* 此时 */
/* prim中令 dist[selected]=0 */
/* dijkstra不添加代码 */
if ( usePrim )
{
dist[selected] = ;
}
for ( i = ; i < nodes.length; i++ ) /* selected->i,更新其他边 */
/* 由于selected已经是集合的一部分, */
/* selected的可达边的距离属于集合的可达边的距离 */
{
/* 在所有的集合的可达边(不包含集合自身)的距离中取较小值 */
/*下面是两种方法相同的部分 */
if ( !visited[i]
&& dist[i] > dist[selected] + edges[selected][i] )
{
dist[i] = dist[selected] + edges[selected][i]
}
}
}
联系:
两者在连边时,用的是同一种贪心策略,即对于将扩展的集合总是在非扩展的点中找一条最短的边入集合,并用新入集合的点修改剩下点的到集合的最短路。
共同点:都有visited标记数组,dist数组,min,distIndex数组
注意:网上大多数教程中,prim算法是没有visited数组的,它用令dist[]=0来简化,而在这里,两种方法都用了visited数组,减少了差异性
区别:
在于dist的修改和意义
dijkstra仅仅就多了一个dist[selected],用做累积距离
而prim中由于dist[selected]=0,故可消去dist[selected]
prim
if(!visited[i] && dist[i] > edges[selected][i])
{dist[i] = edges[selected][i];}
//解释:prim中集合内部的边看做短路,可忽略,长度为0
dijkstra
if(!visited[i]
&& dist[i] > dist[selected]+ edges[selected][i])
{dist[i] = dist[selected]+ edges[selected][i]}
//解释:dijkstra中集合内部的边不可忽略,长度存在
Prim算法与Dijkstra算法的联系与区别的更多相关文章
- 数据结构与算法系列研究七——图、prim算法、dijkstra算法
图.prim算法.dijkstra算法 1. 图的定义 图(Graph)可以简单表示为G=<V, E>,其中V称为顶点(vertex)集合,E称为边(edge)集合.图论中的图(graph ...
- Prim算法和Dijkstra算法的异同
Prim算法和Dijkstra算法的异同 之前一直觉得Prim和Dijkstra很相似,但是没有仔细对比: 今天看了下,主要有以下几点: 1: Prim是计算最小生成树的算法,比如为N个村庄修路,怎么 ...
- 算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
一.名称 动态规划法应用 二.目的 1.贪婪技术的基本思想: 2.学会运用贪婪技术解决实际设计应用中碰到的问题. 三.要求 1.实现基于贪婪技术思想的Prim算法: 2.实现基于贪婪技术思想的Dijk ...
- 最短路径算法(Dijkstra算法、Floyd-Warshall算法)
最短路径算法具体的形式包括: 确定起点的最短路径问题:即已知起始结点,求最短路径的问题.适合使用Dijkstra算法. 确定终点的最短路径问题:即已知终结结点,求最短路径的问题.在无向图中,该问题与确 ...
- Prim算法、Kruskal算法、Dijkstra算法
无向加权图 1.生成树(minimum spanning trees) 图的生成树是它一棵含有所有顶点的无环联通子图 最小生成树:生成树中权值和最小的(所有边的权值之和) Prim算法.Kruskal ...
- 【最短路算法】Dijkstra+heap和SPFA的区别
单源最短路问题(SSSP)常用的算法有Dijkstra,Bellman-Ford,这两个算法进行优化,就有了Dijkstra+heap.SPFA(Shortest Path Faster Algori ...
- 最短路径算法之Dijkstra算法(java实现)
前言 Dijkstra算法是最短路径算法中为人熟知的一种,是单起点全路径算法.该算法被称为是“贪心算法”的成功典范.本文接下来将尝试以最通俗的语言来介绍这个伟大的算法,并赋予java实现代码. 一.知 ...
- 图中最短路径算法(Dijkstra算法)(转)
1.Dijkstra 1) 适用条件&范围: a) 单源最短路径(从源点s到其它所有顶点v); b) 有向图&无向图(无向图可以看作(u,v),(v,u)同属于边集E ...
- 最短路算法之Dijkstra算法通俗解释
Dijkstra算法 说明:求解从起点到任意点的最短距离,注意该算法应用于没有负边的图. 来,看图. 用邻接矩阵表示 int[][] m = { {0, 0, 0, 0, 0, 0}, {0, 0, ...
- 最短路经算法简介(Dijkstra算法,A*算法,D*算法)
据 Drew 所知最短路经算法现在重要的应用有计算机网络路由算法,机器人探路,交通路线导航,人工智能,游戏设计等等.美国火星探测器核心的寻路算法就是采用的D*(D Star)算法. 最短路经计算分静态 ...
随机推荐
- CUBRID学习笔记 42 Hierarchical QuerySQL层级查询
cubrid的中sql查询语法Hierarchical QuerySQL层级查询 ------ 官方文档是英文的,看不明白可以参看ocracle的同类函数说明.很多都是一样的. ORACLE中CONN ...
- python_way ,json(自学)
python_way ,json 如果我们想将多行字典存放到文件中,并且还需要调出这些字典继续使用那么就要是用json. 首先将字典用json转换成字符串,存放到文件中. a = {"tel ...
- Comware 架构理解
网络操作系统 首先什么是网络操作系统: 一种说法是:运行在路由器,网络交换机,防火墙上的特别的操作系统 另一种说法是:部署在局域网或者私有网络,允许网络中的多个计算机共享文件和打印机,因为现在的单机系 ...
- GATK3.2.2小结(转载)
http://blog.csdn.net/skenoy/article/details/38346489 经过几天的摸索和网上资料的查询对GATK软件有点小心得,现总结如下: 1. fasta文件最好 ...
- ubuntu14.04LTS 下storm单机版安装配置
1.下载storm 的安装文件 http://www.apache.org/dyn/closer.cgi/incubator/storm/apache-storm-0.9.2-incubating/a ...
- iBATIS sql(XML)中的大于、小于、like等符号写法
其实就是xml的特殊符号,因为它的配置就是xml,所以可以用下面这种写法转义 < < > > <> < ...
- SAP接口编程 之 JCo3.0系列(01):JCoDestination
SAP接口编程 之 JCo3.0系列(01):JCoDestination 字数2101 阅读103 评论0 喜欢0 JCo3.0是Java语言与ABAP语言双向通讯的中间件.与之前1.0/2.0相比 ...
- maven使用实例记录
Maven入门指南① :Maven 快速入门及简单使用Maven入门指南② :Maven 常用命令,手动创建第一个 Maven 项目Maven入门指南③:坐标和依赖Maven入门指南④:仓库 Mave ...
- bootstrap学习笔记<六>(表单二之按钮)
按钮(补充) (ps:居中元素可以使用<center></center>标签) 块级按钮(ps:按钮占一整行) <button class="btn btn-p ...
- web设计经验<四>设计师必备的20条设计黄金法则
编者按:以下内容摘自<美国视觉设计学院之完形设计>,新手可以多看这些法则,并运用到你的设计过程中,防止自己做出甲方式审美的作品. 一.必须有一个概念 设计从创意开始.这可能是非常不确定的— ...