写这篇博文是因为我怕一两年内,没碰到这个算法,到时候又把它忘了。因为这个算法是图论中,一个非常重要的算法,经常要用到,为了某一天重新拾起这个算法的时候,能够把下面的代码复制一下,然后改装一下再次快速熟练应用它。这个算法在图形学中的三角网格曲面中,可以说是一个基础算法,目前为止,我至少用过十次。在图像中,我也遇到过好几次,比如我写的另一篇博文《基于测地距离的图像分割算法》,这个算法就要与之相结合。

这个算法本身不难,然而对于解释这个算法的流程网上说的乱七八糟的,很多都是c语言版的,用c语言写这个算法,如果没有用结构体,那代码写了起来很乱,每个顶点有好几个相关的变量。下面直接贴一些自己写的代码,以备以后使用:

一、算法大体流程

输入:图、源点seed

输出、图上每个点到源点的 最短距离

Algorithm:

begin

1、初始化所有的点到源点的距离为无穷大

2、把seed到源点的距离置为0

3、把seed加入队列Queue

4、当Queue不为空的时候 循环

{

(1)从队列中选择距离源点最短的顶点Pmin,并从队列中删除

(2)遍历Pmin的邻接顶点q,更新未被冻结的邻接顶点测地距离,即:

如果,邻接顶点q当前测地距离d(q)<d(Pmin)+E(q,Pmin),其中E(q,Pmin)表示Pmin与q点的连接边的长度,那么:

{

更新d;

更新q的前一个路径点为Pmin

}

(3)往队列里插入Pmin未被访问过的邻接顶点q

}

end

二、算法代码实现

主要程序:

vector<cnode>nodes=m_nodes;nodes[seed].distance_from_source()=0.0;//初始化源点的距离为0std::set<cnode_pointer cnode="">Queue0; Queue0.clear(); Queue0.insert(&nodes[seed]);//把源点加入队列nodes[seed].m_VisitFlag=CNode::Active;//标记为加入队列中//广度优先遍历while(!Queue0.empty()){ CNode_pointer min_node = *Queue0.begin();Queue0.erase(Queue0.begin());//提取队列的第一个元素,也就是距离最小的元素min_node->m_VisitFlag=CNode::Frozen;//标记为已访问,即已经加入过队列vector<int>&NeighborE=m_Tmesh->adjancetedge[min_node->m_VertexID];//遍历邻接顶点int NeighborEN=NeighborE.size();//更新邻接顶点的到源点的距离for(int j=0; j<neighboren j="" tedge="" ae="m_Tmesh-">m_edges[NeighborE[j]];int neiv=ae.opposite_vertex(min_node->m_VertexID);CNode_pointer New_node=&nodes[neiv]; if(New_node->m_VisitFlag!=CNode::Frozen){float dist0=(float)(min_node->distance_from_source() +ae.length());if(New_node->distance_from_source() > dist0){New_node->distance_from_source() = dist0;New_node->m_Pre_Edge=NeighborE[j];}} }//邻接顶点中,如果未被加入过队列,那么把这个点插入队列中int vn_nei0=m_Tmesh->neighbors[min_node->m_VertexID].size();for (int j=0;j<vn_nei0 j="" int="" neighbors_of_u="m_Tmesh-">neighbors[min_node->m_VertexID][j];if (nodes[neighbors_of_u].m_VisitFlag==CNode::Inactive){Queue0.insert(&nodes[neighbors_of_u]);nodes[neighbors_of_u].m_VisitFlag=CNode::Active; }}}//while</vn_nei0></neighboren></int></cnode_pointer></cnode>

相关头文件:

class CNode{ typedef CNode* CNode_pointer;public:CNode(void){m_VisitFlag=Inactive;m_GeodesicDistance =std::numeric_limits<float>::max();};~CNode(void){};enum VisitFlag{Frozen,Active,Inactive};VisitFlag m_VisitFlag;float m_GeodesicDistance;int m_VertexID;int m_Pre_Edge;float& distance_from_source(){return m_GeodesicDistance;};virtual bool operator()(CNode_pointer const s1, CNode_pointer const s2) const{return s1->distance_from_source()!=s2->distance_from_source() ?s1->distance_from_source() < s2->distance_from_source() ://不等的时候根据距离排序s1->m_VertexID< s2->m_VertexID;//相等的时候需要根据ID号来};void clear(){m_GeodesicDistance = std::numeric_limits<float>::max();//无穷大数值m_VisitFlag=Inactive;}};typedef CNode* CNode_pointer; </float></float>

本文地址:http://blog.csdn.net/hjimce/article/details/45751503     作者:hjimce     联系qq:1393852684   更多资源请关注我的博客:http://blog.csdn.net/hjimce                原创文章,转载请保留本行信息。

基础知识(四)Dijkstra算法相关推荐

  1. (七)JS基础知识四(搞定异步)【三座大山之三,必考!!!】

    JS基础知识四(异步) 提问 单线程 应用场景 callback hell和promise 提问 同步和异步的区别是什么 手写用Promise加载一张图片 前端使用的异步的场景有哪些 单线程 JS是单 ...

  2. 计算机基础知识教程算法,快速掌握!计算机二级公共基础知识教程:算法

    小编所收集到的相关计算机二级公共基础知识教程:算法的资料 大家要认真阅读哦! 算法是指解题方案的准确而完整的描述.即是一组严谨地定义运算顺序的规则,并且每一个规则都是有效的,且是明确的,没有二义性,同 ...

  3. 跳槽者、应届生必看JAVA面试题系列 - JAVA基础知识(四)

    一: 前言 莫等闲,白了少年头,空悲切. 二: 面试挑战   在文章开始前,首先安利下"面试挑战": 凡是满足下面的挑战条件的,如果一个月内没有拿到一个Offer的,免费提供简历封 ...

  4. C# 基础知识 (四).C#简介及托管代码

            暑假转瞬即逝,从10天的支教生活到1周的江浙沪旅游,在这个漫长的暑假中我经历了很多东西,也学到了很多东西,也认识到了很多不足之处!闲暇之余我准备重新进一步巩固C#相关知识,包括C#入门 ...

  5. post获取重定向的链接 python_【转载】python面试基础知识(四) 网络部分

    最近,小编在整理python面试基础知识,看了很多博客.文章和咨询了一些大厂公司大牛.了解到,在python面试的时候,不仅要求你有项目经验,还要考试代码呢!今天,小编和大家分享一下python面试基 ...

  6. Java基础知识(四) 基本类型与运算

    Java基础知识 基本类型与运算 1. Java提供了哪些基本数据类型 2. 什么是不可变类 3. 值传递与引用传递的区别 4. Math类中的round.ceil和floor方法的功能各是什么 5. ...

  7. OpenGL基础知识(四)

    今天将继续修改OpenGL基础知识(三)中的例子,并进行了一些简单的动画绘制.在编写代码之前先介绍一下函数glutTimerFunc(unsigned int msecs,void (*func) ( ...

  8. 【ECG理论篇】(1)AI实现心律失常判别:心电基础知识及利用算法判别心律失常的分析流程

    最近开始做一个新的项目,使用深度学习来优化传统的心律失常预测算法 因为自己也是初涉这个方向,所以学习开始的第一步就是了解背景知识. 基础词汇 心电图(Electrocardiogram,ECG):指心 ...

  9. 蓝桥杯知识点汇总:基础知识和常用算法

    文章目录 JAVA基础语法: 算法竞赛常用的JAVA API: 算法和数据结构 简单算法 简单数据结构 图论 数学 贪心 动态规划 补充 省赛题解 待更: 此系列包含蓝桥杯(软件类)所考察的绝大部分知 ...

  10. 信号处理——基础知识及常用算法

    文章目录 一.FFT与IFFT 1. FFT 2. IFFT 二.最小二乘法 三.卷积 四.Z变换 五.拉普拉斯变换 六.常用滤波算法 1. 中值滤波 2. 均值滤波 3. 高斯滤波 4. 卡尔曼滤波 ...

最新文章

  1. vue 循环 递归组件_全局组件实现递归树,避免循环引用
  2. 存储系统的类型及特点
  3. 新闻上的文本分类:机器学习大乱斗 王岳王院长 王岳王院长 5 个月前 目标 从头开始实践中文短文本分类,记录一下实验流程与遇到的坑 运用多种机器学习(深度学习 + 传统机器学习)方法比较短文本分类处
  4. Python正则表达式之编译正则表达式(2)
  5. java基础提升篇:Static关键字
  6. JavaScript中的Window窗口对象【转载】
  7. eShopOnContainers 知多少[12]:Envoy gateways
  8. 如何在 Ubuntu 12.04 Server 中安装图形用户界面
  9. python一个函数调用另一个函数的返回值_在python函数中使用True,False和None作为返回值...
  10. vim 之cscope的使用
  11. Centos6.X 安装MongoDb
  12. 阿里云服务器如何修改密码
  13. 单链表以及双向链表的操作
  14. 自动驾驶 8-1: 平方误差准则和最小二乘法 (上) Squared Error Criterion and the Method of Least Squares (Part 1)
  15. Java同步三种实现方式
  16. 后疫情时代,引发户外烧烤的热潮,星淘惠建议卖家可针对布局
  17. 考研政治刷题知识点总结
  18. C语言将UTC时间转为时区时间的方法参考
  19. 在浏览器端浏览EPUB
  20. 安装sql server走过的弯路,收集了一些安装sql遇到的问题

热门文章

  1. charles请求转发_Charles安装与基本操作
  2. 2014年高级计算机操作员工种代码36-323不可积分入户深圳吗,2014年深圳积分入户工种加分考证...
  3. matlab怎么显示bfm模型的纹理模型,BFM模型介绍及可视化实现(C++)
  4. 同步方法中的锁对象_互斥锁与读写锁:如何使用锁完成Go程同步?
  5. android从一个活动到另一个活动,Android应用程序在将一个活动打开到另一个活动时崩溃...
  6. mac 安装laravel Valet环境
  7. RestTemplate实践
  8. 伪样式:hover ,:active,:focus
  9. node.js 端口号被占用解决方法
  10. 关于SQLSERVER2012版本远程登录问题