1. /* 图结构,邻接矩阵形式 */
  2.  
  3. ElemType nodes[n];
  4.  
  5. int edges[n][n];
  6.  
  7. prim_or_dijkstra( int index, bool usePrim ) /* 起点 */
  8.  
  9. {
  10. int dist[n] = { INF }; /* 从起点开始,到其他所有边的距离 */
  11.  
  12. int distIndex[n] = { - };
  13.  
  14. int visited[n] = { };
  15.  
  16. int selected = index; /*选中的点 */
  17.  
  18. /* 初始化起点的可达边距离 */
  19.  
  20. for ( i = ; i < nodes.length; i++ )
  21.  
  22. /* edges[起点][终点]=权重(不是INF就有边),穷举 */
  23.  
  24. {
  25. if ( visited[i] )
  26. break;
  27.  
  28. visited[i] = true;
  29.  
  30. if ( edges[selected][i] != INF )
  31. {
  32. dist[i] = edges[selected][i]; /* index到可达边的距离 */
  33. }
  34. }
  35.  
  36. for ( k = ; k < nodes.length - ; k++ ) /* n-1次循环取点 */
  37.  
  38. {
  39. visited[selected] = true;
  40.  
  41. int min = INF;
  42.  
  43. int sel = -;
  44.  
  45. for ( i = ; i < nodes.length; i++ )
  46.  
  47. /* edges[起点][终点]=权重(不是INF就有边),穷举 */
  48.  
  49. {
  50. if ( visited[i] )
  51. break; /* 属于同一集合,不必考虑 */
  52.  
  53. if ( edges[selected][i] != INF )
  54. {
  55. if ( min > dist[i] )
  56. {
  57. min = dist[i]; sel = i;
  58. }
  59.  
  60. /* min=已经被选中的点的集合到其他单独的点的最短距离 */
  61.  
  62. /* sel=相应的点 */
  63. }
  64. }
  65.  
  66. distIndex[sel] = selected; /* sel->selected映射,存放边 */
  67.  
  68. /* 一个sel只对应一个selected, */
  69.  
  70. /* 一个selected对应多个sel */
  71.  
  72. /* 第一次distIndex v2->v1 */
  73.  
  74. selected = sel; /*选中的点要更新 */
  75.  
  76. /* 此时 */
  77.  
  78. /* prim中令 dist[selected]=0 */
  79.  
  80. /* dijkstra不添加代码 */
  81.  
  82. if ( usePrim )
  83. {
  84. dist[selected] = ;
  85. }
  86.  
  87. for ( i = ; i < nodes.length; i++ ) /* selected->i,更新其他边 */
  88.  
  89. /* 由于selected已经是集合的一部分, */
  90.  
  91. /* selected的可达边的距离属于集合的可达边的距离 */
  92.  
  93. {
  94. /* 在所有的集合的可达边(不包含集合自身)的距离中取较小值 */
  95.  
  96. /*下面是两种方法相同的部分 */
  97.  
  98. if ( !visited[i]
  99.  
  100. && dist[i] > dist[selected] + edges[selected][i] )
  101.  
  102. {
  103. dist[i] = dist[selected] + edges[selected][i]
  104. }
  105. }
  106. }

联系:

两者在连边时,用的是同一种贪心策略,即对于将扩展的集合总是在非扩展的点中找一条最短的边入集合,并用新入集合的点修改剩下点的到集合的最短路。

共同点:都有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算法的联系与区别的更多相关文章

  1. 数据结构与算法系列研究七——图、prim算法、dijkstra算法

    图.prim算法.dijkstra算法 1. 图的定义 图(Graph)可以简单表示为G=<V, E>,其中V称为顶点(vertex)集合,E称为边(edge)集合.图论中的图(graph ...

  2. Prim算法和Dijkstra算法的异同

    Prim算法和Dijkstra算法的异同 之前一直觉得Prim和Dijkstra很相似,但是没有仔细对比: 今天看了下,主要有以下几点: 1: Prim是计算最小生成树的算法,比如为N个村庄修路,怎么 ...

  3. 算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法

    一.名称 动态规划法应用 二.目的 1.贪婪技术的基本思想: 2.学会运用贪婪技术解决实际设计应用中碰到的问题. 三.要求 1.实现基于贪婪技术思想的Prim算法: 2.实现基于贪婪技术思想的Dijk ...

  4. 最短路径算法(Dijkstra算法、Floyd-Warshall算法)

    最短路径算法具体的形式包括: 确定起点的最短路径问题:即已知起始结点,求最短路径的问题.适合使用Dijkstra算法. 确定终点的最短路径问题:即已知终结结点,求最短路径的问题.在无向图中,该问题与确 ...

  5. Prim算法、Kruskal算法、Dijkstra算法

    无向加权图 1.生成树(minimum spanning trees) 图的生成树是它一棵含有所有顶点的无环联通子图 最小生成树:生成树中权值和最小的(所有边的权值之和) Prim算法.Kruskal ...

  6. 【最短路算法】Dijkstra+heap和SPFA的区别

    单源最短路问题(SSSP)常用的算法有Dijkstra,Bellman-Ford,这两个算法进行优化,就有了Dijkstra+heap.SPFA(Shortest Path Faster Algori ...

  7. 最短路径算法之Dijkstra算法(java实现)

    前言 Dijkstra算法是最短路径算法中为人熟知的一种,是单起点全路径算法.该算法被称为是“贪心算法”的成功典范.本文接下来将尝试以最通俗的语言来介绍这个伟大的算法,并赋予java实现代码. 一.知 ...

  8. 图中最短路径算法(Dijkstra算法)(转)

    1.Dijkstra 1)      适用条件&范围: a)   单源最短路径(从源点s到其它所有顶点v); b)   有向图&无向图(无向图可以看作(u,v),(v,u)同属于边集E ...

  9. 最短路算法之Dijkstra算法通俗解释

    Dijkstra算法 说明:求解从起点到任意点的最短距离,注意该算法应用于没有负边的图. 来,看图. 用邻接矩阵表示 int[][] m = { {0, 0, 0, 0, 0, 0}, {0, 0, ...

  10. 最短路经算法简介(Dijkstra算法,A*算法,D*算法)

    据 Drew 所知最短路经算法现在重要的应用有计算机网络路由算法,机器人探路,交通路线导航,人工智能,游戏设计等等.美国火星探测器核心的寻路算法就是采用的D*(D Star)算法. 最短路经计算分静态 ...

随机推荐

  1. XSS防御篇

    上周要求写自己用任何语言写一个留言版,存到数据库中,用自己的办法来解决XSS 我用了JSP+MYSQL,自己写了一个过滤器来防御WEB XSS漏洞 package com.mess.filter; p ...

  2. MemSQL Start[c]UP 2.0 - Round 1(无聊练手B题)

    http://codeforces.com/contest/452/problem/B   B. 4-point polyline time limit per test 2 seconds memo ...

  3. 转 图片资源加密,Lua文件加密

    游戏开发中常遇到资源保护的问题. 目前游戏开发中常加密的文件类型有:图片,Lua文件,音频等文件,而其实加密也是一把双刃剑. 需要安全那就得耗费一定的资源去实现它.目前网上也有用TexturePack ...

  4. iOS - OC Struct 结构体

    1.结构体的定义与调用 // 定义结构体类型 // 结构体类型名为 MyDate1 struct MyDate1 { int year; int month; int day; }; // 定义结构体 ...

  5. 流媒体基础实践之——Nginx-RTMP-module 指令详解

    转载网址:http://blog.csdn.net/aoshilang2249/article/details/51483814

  6. VNC的安装与配置

    一,安装tigervnc-server VNC软件包 [root@localhost ~]# yum install tigervnc-server 设置开机自启动 [root@localhost ~ ...

  7. JavaSE复习_9 集合框架复习

    △列表迭代器也是不支持在迭代的时候添加元素的,只是列表迭代器自己定义了增删的方法而已.迭代器可以看成实在两个元素之间的指针,每当调用next就跳过一个元素并返回刚刚跳过的元素. △HashTable不 ...

  8. python剑指网络篇一

    #coding:utf-8 __author__ = 'similarface' #!/usr/bin/env python import socket #二进制和ASCII互转及其它进制转换 fro ...

  9. maven各种插件在总结

    http://blog.csdn.net/taiyangdao/article/category/6377863  好文章系列课程

  10. perl 语法速查

    同时学perl.python和shell脚本会很容易将它们的语法搞混,本文主要是一个个人的总结,方便要用时的查询. perl基本语法.安装.帮助文档 文件头格式: #!/usr/bin/perl us ...