选择某一个点开始,每次去找这个点的最短边,然后再从这个开始不断迭代,更新距离.

代码:

  1. 朴素(vector存图)

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <stack>
    #include <queue>
    #include <vector>
    #include <map>
    #include <set>
    #include <unordered_set>
    #include <unordered_map>
    #define ll long long
    #define fi first
    #define se second
    #define pb push_back
    #define me memset
    const int N = 1e6+10;
    const int mod = 1e9 + 7;
    const int INF = 0x3f3f3f3f;
    using namespace std;
    typedef pair<int,int> PII;
    typedef pair<ll,ll> PLL; int n,m,s;
    struct misaka{
    int to;
    int val;
    }p;
    vector<misaka> v[N];
    int dis[N];
    bool st[N]; void dijkstra(){
    me(dis,INF,sizeof(dis));
    dis[s]=0;
    for(int i=0;i<n;++i){
    int t=-1;
    for(int j=1;j<=n;++j){
    if(!st[j] && (t==-1 || dis[t]>dis[j])) t=j; //确定路径最短的点
    }
    st[t]=true;
    for(auto w:v[t]){
    dis[w.to]=min(dis[w.to],dis[t]+w.val);
    }
    }
    } int main() {
    ios::sync_with_stdio(false);cin.tie(0);
    cin>>n>>m>>s; while(m--){
    int a;
    cin>>a;
    cin>>p.to>>p.val;
    v[a].pb(p);
    } dijkstra(); for(int i=1;i<=n;++i){
    cout<<dis[i]<<" ";
    } return 0;
    }
  2. 堆(优先队列)优化

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <stack>
    #include <queue>
    #include <vector>
    #include <map>
    #include <set>
    #include <unordered_set>
    #include <unordered_map>
    #define ll long long
    #define fi first
    #define se second
    #define pb push_back
    #define me memset
    const int N = 1e6 + 10;
    const int mod = 1e9 + 7;
    const int INF = 0x3f3f3f3f;
    using namespace std;
    typedef pair<int,int> PII;
    typedef pair<ll,ll> PLL; struct misaka{
    int out;
    int val;
    }e; int n,m,s;
    int dis[N];
    bool st[N];
    vector<misaka> v[N]; void dijkstra(){
    me(dis,INF,sizeof(dis));
    dis[1]=0; priority_queue<PII,vector<PII>,greater<PII>> h;
    h.push({0,s}); while(!h.empty()){
    auto tmp=h.top();
    h.pop(); int num=tmp.se;
    int dist=tmp.fi;
    if(st[num]) continue;
    st[num]=true;
    for(auto w:v[num]){
    int j=w.out;
    if(dis[j]>dist+w.val){
    dis[j]=dist+w.val;
    h.push({dis[j],j});
    }
    }
    }
    } int main() {
    ios::sync_with_stdio(false);cin.tie(0);
    cin>>n>>m>>s;
    while(m--){
    int a;
    cin>>a>>e.out>>e.val;
    v[a].pb(e);
    } dijkstra();
    for(int i=1;i<=n;++i){
    cout<<dis[i]<<" ";
    } return 0;
    }

单源最短路问题 Dijkstra 算法(朴素+堆)的更多相关文章

  1. 单源最短路径Dijkstra算法,多源最短路径Floyd算法

    1.单源最短路径 (1)无权图的单源最短路径 /*无权单源最短路径*/ void UnWeighted(LGraph Graph, Vertex S) { std::queue<Vertex&g ...

  2. 单源最短路径——dijkstra算法

    dijkstra算法与prim算法的区别   1.先说说prim算法的思想: 众所周知,prim算法是一个最小生成树算法,它运用的是贪心原理(在这里不再证明),设置两个点集合,一个集合为要求的生成树的 ...

  3. 单源最短路径 dijkstra算法实现

    本文记录一下dijkstra算法的实现,图用邻接矩阵表示,假设图为无向图.而且连通,有向图,不连通图的做法相似. 算法简述: 首先确定"单源"的源.假设是第0个顶点. 维护三个数组 ...

  4. 单源最短路径-Dijkstra算法

    1.算法标签 贪心 2.算法描述 具体的算法描述网上有好多,我觉得莫过于直接wiki,只说明一些我之前比较迷惑的. 对于Dijkstra算法,最重要的是维护以下几个数据结构: 顶点集合S : 表示已经 ...

  5. 单源最短路径——Dijkstra算法学习

    每次都以为自己理解了Dijkstra这个算法,但是过没多久又忘记了,这应该是第4.5次重温这个算法了. 这次是看的胡鹏的<地理信息系统>,看完之后突然意识到用数学公式表示算法流程是如此的好 ...

  6. hdu 2544 单源最短路问题 dijkstra+堆优化模板

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  7. [ACM_图论] Domino Effect (POJ1135 Dijkstra算法 SSSP 单源最短路算法 中等 模板)

    Description Did you know that you can use domino bones for other things besides playing Dominoes? Ta ...

  8. 最短路问题 Dijkstra算法- 路径还原

    // 路径还原 // 求最短路,并输出最短路径 // 在单源最短路问题中我们很容易想到,既然有许多条最短路径,那将之都存储下来即可 // 但再想一下,我们是否要把所有的最短路径都求出来呢? // 实际 ...

  9. 单源最短路问题:OJ5——低德地图

    本题就是一道单源最短路问题.由于是稀疏图,我们采用Dijkstra算法. Dijkstra算法原理 Dijkstra算法的步骤 我们把所有的节点分为两个集合:被选中的(visited==1) 和 未被 ...

随机推荐

  1. Openstack Ocata 公共服务端(三)

    Openstack Ocata 公共服务端 mysql 安装: yum install mariadb mariadb-server mysql 安装过程省略 rabbit-server 安装包: # ...

  2. 【RAC】11gRAC 搭建(VMware+裸设备)

    安装环境与网络规划 安装环境 主机操作系统:windows 7虚拟机VMware12:两台Oracle Linux R6 U5 x86_64 Oracle Database software: Ora ...

  3. kubernets之控制器之间的协作以及网络

    一  创建一个deployment的时候整个kubernets集群的资源和事件的调用链 1.1  创建一个deployment的资源,在提交的时候,集群中的调度器,控制器以及node节点上kubele ...

  4. playwright自动化项目搭建

    这是关于playwright系列介绍的最后一篇.搭建基于 playwright 的自动化项目. GitHub地址: https://github.com/defnngj/playwright-pro ...

  5. 自翻------Office 2013 RT 使用说明

    Office Home and Student 2013 RT Preview的更新 介绍 Microsoft已发布Microsoft Office Home and Student 2013 RT ...

  6. 前端面试之ES6中的继承!

    前端面试之ES6中的继承! ES6之前并没有给我们提供 extends继承.我们可以通过构造函数+原型对象模拟实现继承,被称为组合继承. 1 call() 两个作用: 1 调用这个函数! 2 修改函数 ...

  7. 使用Bat自动打包并通过FTP发送到备份服务器——实战测试

    这个bat文件要求本地安装有winrar解压软件,位置是:C:\Program Files\WinRAR\WinRAR.exe 如果执行报错,请检查你复制我的代码是否有问题,有些复制粘贴进去后因为一些 ...

  8. jQuery 选项卡切换过渡效果

    <!DOCTYPE html> <head> <meta charset="utf-8"> <title></title> ...

  9. Micro Frontends 微前端

    Micro Frontends https://martinfowler.com/articles/micro-frontends.html Integration approaches Server ...

  10. http2 http1 对比

    RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2) https://tools.ietf.org/html/rfc7540#page-4 ...