`

Dijkstra算法模板

 
阅读更多

 

#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#define maxn 500       //图的规模
#define INF 1<<30
using namespace std;

struct Edge {           //存放边的信息 dist为距离
       int from,to,dist;
};

struct HeapNode {         //算法用到的优先队列的节点
       int d, u;
       bool operator < (const HeapNode& rhs) const {
              return d > rhs.d;
       }
};

struct Dijkstra {
       int n, m;              //点数和边数
       vector<Edge> edges;    //边列表
       vector<int> G[maxn];   //每个节点出发的边编号 从0开始
       bool done[maxn];       //是否已经永久标号
       int d[maxn];           //s 到各个点的距离
       int p[maxn];           //最短路上的一条边

       void init(int n) {       //n为图中节点个数
              this->n = n;
              for(int i = 0; i < n; i++) G[i].clear();   //清空邻接表
              edges.clear();                            //清空边表
       }

       void AddEdge(int from, int to, int dist) {
              //如果是无向图,每条边需要调用两次AddEdge
              edges.push_back((Edge){from, to, dist});
              m = edges.size();
              G[from].push_back(m-1);
       }

       void dijkstra(int s) {                   //求s到所有点的距离
              priority_queue<HeapNode> Q;
              for(int i = 0; i < n; i++) d[i] = INF;
              d[s] = 0;
              memset(done, 0, sizeof(done));
              Q.push((HeapNode){0, s});
              while(!Q.empty()) {
                     HeapNode x = Q.top(); Q.pop();
                     int u = x.u;
                     if(done[u]) continue;
                     done[u] = true;
                     for(int i = 0; i < G[u].size(); i++) {
                            Edge& e = edges[G[u][i]];
                            if(d[e.to] > d[u] + e.dist) {
                                   d[e.to] = d[u] + e.dist;
                                   p[e.to] = G[u][i];
                                   Q.push((HeapNode){d[e.to], e.to});
                            }
                     }
              }
       }
};

 

 

 

 

 

分享到:
评论

相关推荐

    Dijkstra(迪杰斯特拉)算法模板

    Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表的...

    文档最短路问题Dijkstra算法

    文档最短路问题Dijkstra算法提取方式是百度网盘分享地址

    文档Dijkstra算法实现与分析

    文档Dijkstra算法实现与分析提取方式是百度网盘分享地址

    Dijkstra算法

    Dijkstra算法和模板,浙江大学研究生上机考试题。

    ACM.rar_dijkstra算法_配对堆

    计算单源最短路径 基于dijkstra的配对堆优化 附赠kuangbin的算法模板

    基于dijkstra算法及仓储多AGV背景下实现路径规划和两车避让系统源码+项目说明.zip

    基于dijkstra算法及仓储多AGV背景下实现路径规划和两车避让系统源码+项目说明.zip dijkstra算法 经典Dijkstra算法是一种贪心算法,根据路径长度递增次序找到最短路径,通常用于解决单源最短路的问题。Dijkstra算法...

    常用算法模板_C++.zip

    常用算法模板_C++.zip AC自动机,Dijkstra,Floyd,GCD,KMP,KMP扩展,Kruskal,LCM,LCS,LIS,Prim,SPFA,埃氏筛,背包,并查集,多边形面积,二分搜索,高精度加法,高精度阶乘,级角排序,进制转换,快速幂,...

    acm 图论模板,最短路径dijkstra的模板,通俗易懂

    适合于单源最短路径算法,采用的是dijkstra最短路径算法。简单易懂,本题在hdu.edu.cn上通过了,网址是http://acm.hdu.edu.cn/search.php?field=problem&key=2680。由于不能同时上传两个文件,所以我放到另一个去了...

    ACM 算法模板集

    ACM 算法模板集 Contents 一. 常用函数与STL 二. 重要公式与定理 1. Fibonacci Number 2. Lucas Number 3. Catalan Number 4. Stirling Number(Second Kind) 5. Bell Number 6. Stirling's Approximation 7. Sum of ...

    堆优化dijkstra代码模板示例

    dijkstra时间优化,堆优化,优先队列,最短路算法,O(NlogN)空间时间优化,链式存储,邻接表存图,NOIP,ACM算法竞赛,数据结构

    图算法(c++模板)

    用c++模板写的图算法,包括广搜、深搜、最小生成树算法(prim、kruskal)、单源最短路径(bellman-ford、dijkstra)、拓扑排序,prim、dijkstra算法使用优先级队列实现

    使用标准模板库写迪杰斯特拉算法

    邻接矩阵用的是标准库中的map关联数组实现的,代码很优雅。在实现具体dijkstra算法时,使用了模板库中的优先队列,效率高。

    SPFA算法模板

    求单源最短路的SPFA算法的全称是:Shortest Path Faster Algorithm。...很多时候,给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了。

    上海交通大学ACM算法模板

    用于打比赛的ACM算法模板 常用函数与STL 重要公式与定理 1. Fibonacci Number 2. Lucas Number 3. Catalan Number 4. Stirling Number(Second Kind) 5. Bell Number 6. Stirling's Approximation 7. Sum of ...

    基于dijkstra算法实现的多AGV路径规划和两车避让C++源码+文档说明

    &lt;项目介绍&gt; 项目背景 现代化仓库中AGV(自动避障小车)的使用颇多,本项目为AGV的路径规划和多车避让提供一种较为初级的解决方案。 首先,基于实际仓库运作场景,本文做出以下假设: 通常情况下,AGV的数量恒定,...

    ACM.algorithm.rar_GCD矩阵_匈牙利_区间匹配_最短路 三维_模板元

    各种算法模板(二分图最大匹配匈牙利算法、最小生成树prime和kruskal算法、Dijkstra算法、两点最短路径负权值边SPFA算法、图任意两点最短路径Floy算法、网络最大流SAP算法、网络最大流最小费用算法、乘法逆元gcd扩展...

    ACM算法模板和pku代码

    本科参加ACM竞赛的过程中积累下来的一部分算法模板,和自己在PKU上面做的一部分题目。 模板目录结构: 目录: 动态规划 O(n^2)的最长上升子序列 nlogn最长上升子序列 高精度 计算几何 Graham扫描法 两线段交点 凸...

    图论知识点+算法实现课件

    1. Dijkstra算法:从起点开始按照距离逐步扩展,记录每个点到起点的距离,并标记已经找到最短路径的点。 2. Bellman-Ford算法:允许边权为负数,通过松弛操作逐步更新每个点到起点的最短距离,可以检测负权环。 3....

    ACM算法模板选doc

    算法,模板,ACM 十进制转任意进制 阶乘非零 负二进制 高精度幂 n最长公共子串 Prim最小生成树 Kruskal最小生成树 Dijkstra最短路径 Bellman-Ford 卡塔兰数 组合序列 整点三角形 BFS最长路径 树状数组 背包 凸包...

Global site tag (gtag.js) - Google Analytics