`

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算法的主要特点是采用贪心策略,通过不断扩展与起点...

    labuladong的算法小抄完整版

    还有Dijkstra算法和Floyd-Warshall算法,分别用于单源最短路径和所有对最短路径。 4. **动态规划**:通过构建子问题来求解复杂问题,避免重复计算,如斐波那契数列、背包问题、最长公共子序列等。 5. **贪心算法**...

    ACM.rar_dijkstra算法_配对堆

    kuangbin的ACM模板(新).pdf可能包含的是Kuangbin,一位在ACM竞赛圈内知名的选手或教练,总结的算法模板。这个模板可能详细介绍了如何在实际编程中实现Dijkstra算法,并结合配对堆进行优化,包括如何初始化配对堆,...

    文档Dijkstra算法实现与分析

    ### 文档Dijkstra算法实现与分析 #### Dijkstra算法简介 Dijkstra算法是一种用于寻找图中两点间最短路径的经典算法。它是由荷兰计算机科学家Edsger W. Dijkstra于1956年提出的,并在1959年的论文中正式发表。该...

    Dijkstra算法作业的模板.xlsx

    Dijkstra算法作业的模板.xlsx

    Dijkstra算法找最短路径代码,dijkstra算法求最短路径,matlab源码.zip

    Dijkstra算法是一种经典的图论算法,由荷兰计算机科学家艾兹格·迪科斯彻于1956年提出,主要用于解决单源最短路径问题。它可以在加权有向图或无向图中找到从一个特定起点到其他所有顶点的最短路径。在本压缩包中,...

    matlab-基于Dijkstra算法的网络路由最短路径matlab仿真,动态显示Dijkstra算法搜索路径的过程-源码

    Dijkstra算法是一种广泛应用的寻找图中两点间最短路径的经典算法,由荷兰计算机科学家艾兹格·迪科斯彻于1956年提出。这个算法适用于加权有向图或无向图,其目标是找到从一个特定节点(起点)到其他所有节点的最短...

    文档最短路问题Dijkstra算法

    ### 文档最短路问题Dijkstra算法 #### Dijkstra算法简介 Dijkstra算法是由荷兰计算机科学家Edsger W. Dijkstra于1956年提出的一种用于解决带权重图中的单源最短路径问题的经典算法。它能有效地找出从一个起点到图...

    代码模板 Dijkstra算法

    本程序用于求解有向图中从源顶点至沉淀顶点间的最短距离,求解算法为Dijkstra算法,程序编制语言为:java使用说明推荐使用Eclipse或IDEA等主流集成开发环境,新建空白项目,将源文件“Dijkstra.java”复制到项目的...

    Dijkstra算法验证

    **Dijkstra算法验证** Dijkstra算法,由荷兰计算机科学家艾兹格·迪科斯彻(Edsger W. Dijkstra)于1956年提出,是一种用于寻找图中两点间最短路径的算法。在计算机科学中,尤其是在图论、网络路由和路径查找等领域...

    单源最短路径dijkstra模板

    Dijkstra算法是一种常用的图算法,用于解决单源最短路径问题。该算法的基本思想是,通过维护一个距离数组,记录从源节点到其他所有节点的最短距离,并不断更新这些距离,使得它们变得越来越小,直到所有节点的最短...

    QT c++ dijkstra最短路径工程源码

    1. **Dijkstra算法**:Dijkstra算法是图论中用于寻找有向或无向图中两个节点之间最短路径的著名算法。由荷兰计算机科学家艾兹格·迪科斯彻在1956年提出,适用于计算单源最短路径。它通过不断更新节点的最短距离并...

    NOIP基本算法模板

    标题“NOIP基本算法模板”指向了信息学奥林匹克竞赛(NOIP)中常见的算法模板。NOIP竞赛是面向中学生的信息学竞赛,旨在考查学生的算法设计与编程能力。这一部分知识广泛适用于信息学竞赛的普及组和提高组,特别是用...

    毕设项目:基于springboot+mysql+Dijkstra算法实现物流优化管理系统.zip

    标题中的“毕设项目:基于springboot+mysql+Dijkstra算法实现物流优化管理系统”揭示了这个项目的主题,它是一个利用Spring Boot、MySQL数据库以及Dijkstra算法构建的物流优化管理系统。这个系统旨在通过智能算法和...

    单源最短路径问题的Dijkstra算法

    ### 单源最短路径问题的Dijkstra算法详解 #### 一、算法背景与应用场景 在图论中,单源最短路径问题是指在一个带有非负权重边的有向图或无向图中找到从一个指定顶点(称为源点)到其他所有顶点的最短路径的问题。...

    基于QT实现的地图导航系统(Dijkstra算法).zip

    【基于QT实现的地图导航系统(Dijkstra算法)】 在IT领域,地图导航系统是现代生活中的重要组成部分,尤其在自动驾驶和智能交通系统中扮演着关键角色。这个项目是使用QT库来构建的,QT是一个跨平台的C++应用程序开发...

    acwing基础算法模板整理

    Dijkstra算法用于找出图中单源最短路径,而Floyd-Warshall算法可以找出所有对之间的最短路径。另外,拓扑排序和最小生成树(如Prim算法或Kruskal算法)也是图论中的重要概念。 最后,**数学知识**在算法设计中起着...

    最短路算法模板 最短路算法模板

    Dijkstra算法是求单源最短路径的常用算法,适用于非负权重的图。它使用优先队列(通常用二叉堆实现)来选择当前未访问顶点中距离源点最近的一个,然后更新其相邻顶点的最短路径。时间复杂度为O((E+V)logV),其中E是...

    STUACM算法模板_算法模板_

    图论算法如最短路径问题(Dijkstra算法、Floyd-Warshall算法)和拓扑排序也是常见内容。此外,回溯法和剪枝技巧对于解决组合优化问题,如八皇后问题、N皇后问题、数独求解等很有帮助。 在实际应用中,模板还可能...

Global site tag (gtag.js) - Google Analytics