Dijkstra的实现有很多种,下面给出一种较为简洁和高效的实现,可以作为模板快速使用。

  1. 使用邻接表存储图;

  2. 使用标准STL的vector存储每个点的所有邻接边;

  3. 使用pair记录当前搜索的点,pair<int,int>对:

    first记录最小距离,用以在优先队列中实现类似'最小堆优化';

    second记录该最小距离对应的点;

  4. 使用priority_queue实现优化;(附使用方法)

  5. 一个细节:这是盲目检索,中途若D[i] < p.first,说明队列里的该点已经到达了,这个pair已经无效,直接continue;

  实现:

 #include<bits/stdc++.h>
#define INF 100000005
#define MAX 100006
using namespace std; typedef pair<int,int> P; struct edge{
int to;
int cost;
edge(int t,int c):to(t),cost(c){
}
}; const int N = ;
vector<edge> g[N];
int D[N]; //距离
int n,m; //n个点 m条边 void Dijkstra(int s){
priority_queue<P,vector<P>,greater<P> > que; //小端优先队列
fill(D,D+MAX,INF);//注意必须初始化为最大
D[s] = ;
que.push(P(,s));
while(!que.empty()){
P p = que.top();
que.pop();
int v = p.second;
if(D[v] < p.first) continue; //说明该点无需重复
for(int i = ;i<g[v].size();i++) {
//遍历所有后续边
edge e = g[v][i];
int to = e.to;
int cost = e.cost;
if(D[to] > D[v] + cost){
D[to] = D[v] + cost;
que.push(P(D[to],to));
}
}
}
} int main(){
cin>>n>>m;
int a,b,d;
//Vector<edge> g[MAX]的初始化
for(int i = ;i<MAX;i++) {
g[i].clear();
}
//距离D的初始化
//fill(D,D+MAX,INF) ;//等Dijkstra时再初始化也行
for(int i = ;i<m;i++){
cin>>a>>b>>d;
g[a].push_back(edge(b,d));
g[b].push_back(edge(a,d));
}
int s,t;//起点 终点
s = ;
t = n;
Dijkstra(s);
cout<<D[n]<<endl;
return ;
}

  【Appendix】

  priority_queue的使用方法:

  • 对于基本数据:

    • priority_queue<int> q;
    • priority_queue<int,vector<int>,less<int> > q; //默认,less可以省
    • 这创建的是‘大 ’优先队列,大的在top
    • 取:q.top();
    • 出:q.pop();
    • 放:q.push(int);
  • 创建‘小 ’优先队列:

    • priority_queue<int,vector<int>,greater<int> > q;
  • 对于结构体数据:

    • 1. 结构体运算符重载

     bool operator < (const struct1,const struct1) const{
       return ?;
      }

    • 2. 定义cmp函数,做参数传入,更加灵活

      bool cmp(struct1,struct2){
         return ?;
      }
      priority_queue<struct1,vector<struct2>,cmp> q;

  

【C/C++】Dijkstra算法的简洁实现的更多相关文章

  1. Dijkstra算法求解最短路径分析

    最短路径是图论算法中的经典问题.图分为有向图.无向图,路径权值有正值.负值,针对不同的情况需要分别选用不同的算法.在维基上面给出了各种不同的场景应用不同的算法的基本原则:最短路问题. 针对无向图,正权 ...

  2. Dijkstra算法and Floyd算法 HDU 1874 畅通工程续

    Dijkstra算法描述起来比较容易:它是求单源最短路径的,也就是求某一个点到其他各个点的最短路径,大体思想和prim算法差不多,有个数组dis,用来保存源点到其它各个点的距离,刚开始很好办,只需要把 ...

  3. 图论之最短路径(1)——Floyd Warshall & Dijkstra算法

    开始图论学习的第二部分:最短路径. 由于知识储备还不充足,暂时不使用邻接表的方法来计算. 最短路径主要分为两部分:多源最短路径和单源最短路径问题 多源最短路径: 介绍最简单的Floyd Warshal ...

  4. 基于STL优先队列和邻接表的dijkstra算法

    首先说下STL优先队列的局限性,那就是只提供入队.出队.取得队首元素的值的功能,而dijkstra算法的堆优化需要能够随机访问队列中某个节点(来更新源点节点的最短距离). 看似可以用vector配合m ...

  5. Dijkstra算法的另一种证明

    按:今天看Tanenbaum的计算机网络时讲到了Dijkstra算法.关于算法的正确性,<算法导论>给出了严格的证明.CLRS的证明基于一个通用的框架,非常清晰.今天只是随意想想是否有其他 ...

  6. 图论算法(四)Dijkstra算法

    最短路算法(三)Dijkstra算法 PS:因为这两天忙着写GTMD segment_tree,所以博客可能是seg+图论混搭着来,另外segment_tree的基本知识就懒得整理了-- Part 1 ...

  7. 求两点之间最短路径-Dijkstra算法

     Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.D ...

  8. Dijkstra算法优先队列实现与Bellman_Ford队列实现的理解

    /* Dijkstra算法用优先队列来实现,实现了每一条边最多遍历一次. 要知道,我们从队列头部找到的都是到 已经"建好树"的最短距离以及该节点编号, 并由该节点去更新 树根 到其 ...

  9. 关于dijkstra算法的一点理解

    最近在准备ccf,各种补算法,图的算法基本差不多看了一遍.今天看的是Dijkstra算法,这个算法有点难理解,如果不深入想的话想要搞明白还是不容易的.弄了一个晚自习,先看书大致明白了原理,就根据书上的 ...

随机推荐

  1. zepto和jQuery on事件委托在苹果手机上的”坑“

    移动端用zepto做的页面,突然发现on绑定的click事件并没有触发,代码如下: <ul> <li class="a">1111111aaaaaaasss ...

  2. 通过 docker 来搭建 Jenkins

    mkdir /data/jenkins -p mkdir /data/jenkins/{conf,data} -p echo "Asia/Shanghai" > /data/ ...

  3. npm run dev 启动错误:Module build failed: Error: No PostCSS Config found in:xxxxxxxxxxxxxx

    解决办法:在根目录新建postcss.config.js module.exports = { plugins: { 'autoprefixer': {browsers: 'last 5 versio ...

  4. iOS-----------进阶书籍收藏

    1.编写高质量iOS与OS X代码的52个有效方法 (Effective Objective-C 2.0) 这本书介绍了一些OC的语法技巧,runtime,内存管理等方面的知识.书已买,准备入手. 2 ...

  5. Android八门神器(一): OkHttp框架源码解析

    HTTP是我们交换数据和媒体流的现代应用网络,有效利用HTTP可以使我们节省带宽和更快地加载数据,Square公司开源的OkHttp网络请求是有效率的HTTP客户端.之前的知识面仅限于框架API的调用 ...

  6. AD域安装及必要设置

    本文主要介绍AD域的安装和程序开发必要的设置.   一.安装AD域 运行dcpromo命令,安装AD域. 步骤:     1.win+R     2.dcpromo 图例:           百度百 ...

  7. 关于SNMP的MIB文件的语法简述

    源地址:https://blog.csdn.net/carechere/article/details/51236184 SNMP协议的MIB文件的常见宏定义的描述: 对MIB文件中一些常见的宏定义的 ...

  8. nginx实现新老网站跳转(原URL不变)

    新老网站实现跳转 原URL保持不变 通过手动添加cookie 匹配cookie的方法进行跳转第一步 进行添加if判断条件 if ( $query_string ~* "sr=pro" ...

  9. 如何删除windows中运行的历史记录

    参照下图进入到注册表,依次打开红圈中的路径,在RunMRU里面列出来的全部是记录,全部删除即可

  10. Log4j分级别保存日志到单个文件中,并记录IP和用户信息

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration S ...