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

代码:

  1. 朴素(vector存图)

    1. #include <iostream>
    2. #include <cstdio>
    3. #include <cstring>
    4. #include <cmath>
    5. #include <algorithm>
    6. #include <stack>
    7. #include <queue>
    8. #include <vector>
    9. #include <map>
    10. #include <set>
    11. #include <unordered_set>
    12. #include <unordered_map>
    13. #define ll long long
    14. #define fi first
    15. #define se second
    16. #define pb push_back
    17. #define me memset
    18. const int N = 1e6+10;
    19. const int mod = 1e9 + 7;
    20. const int INF = 0x3f3f3f3f;
    21. using namespace std;
    22. typedef pair<int,int> PII;
    23. typedef pair<ll,ll> PLL;
    24. int n,m,s;
    25. struct misaka{
    26. int to;
    27. int val;
    28. }p;
    29. vector<misaka> v[N];
    30. int dis[N];
    31. bool st[N];
    32. void dijkstra(){
    33. me(dis,INF,sizeof(dis));
    34. dis[s]=0;
    35. for(int i=0;i<n;++i){
    36. int t=-1;
    37. for(int j=1;j<=n;++j){
    38. if(!st[j] && (t==-1 || dis[t]>dis[j])) t=j; //确定路径最短的点
    39. }
    40. st[t]=true;
    41. for(auto w:v[t]){
    42. dis[w.to]=min(dis[w.to],dis[t]+w.val);
    43. }
    44. }
    45. }
    46. int main() {
    47. ios::sync_with_stdio(false);cin.tie(0);
    48. cin>>n>>m>>s;
    49. while(m--){
    50. int a;
    51. cin>>a;
    52. cin>>p.to>>p.val;
    53. v[a].pb(p);
    54. }
    55. dijkstra();
    56. for(int i=1;i<=n;++i){
    57. cout<<dis[i]<<" ";
    58. }
    59. return 0;
    60. }
  2. 堆(优先队列)优化

    1. #include <iostream>
    2. #include <cstdio>
    3. #include <cstring>
    4. #include <cmath>
    5. #include <algorithm>
    6. #include <stack>
    7. #include <queue>
    8. #include <vector>
    9. #include <map>
    10. #include <set>
    11. #include <unordered_set>
    12. #include <unordered_map>
    13. #define ll long long
    14. #define fi first
    15. #define se second
    16. #define pb push_back
    17. #define me memset
    18. const int N = 1e6 + 10;
    19. const int mod = 1e9 + 7;
    20. const int INF = 0x3f3f3f3f;
    21. using namespace std;
    22. typedef pair<int,int> PII;
    23. typedef pair<ll,ll> PLL;
    24. struct misaka{
    25. int out;
    26. int val;
    27. }e;
    28. int n,m,s;
    29. int dis[N];
    30. bool st[N];
    31. vector<misaka> v[N];
    32. void dijkstra(){
    33. me(dis,INF,sizeof(dis));
    34. dis[1]=0;
    35. priority_queue<PII,vector<PII>,greater<PII>> h;
    36. h.push({0,s});
    37. while(!h.empty()){
    38. auto tmp=h.top();
    39. h.pop();
    40. int num=tmp.se;
    41. int dist=tmp.fi;
    42. if(st[num]) continue;
    43. st[num]=true;
    44. for(auto w:v[num]){
    45. int j=w.out;
    46. if(dis[j]>dist+w.val){
    47. dis[j]=dist+w.val;
    48. h.push({dis[j],j});
    49. }
    50. }
    51. }
    52. }
    53. int main() {
    54. ios::sync_with_stdio(false);cin.tie(0);
    55. cin>>n>>m>>s;
    56. while(m--){
    57. int a;
    58. cin>>a>>e.out>>e.val;
    59. v[a].pb(e);
    60. }
    61. dijkstra();
    62. for(int i=1;i<=n;++i){
    63. cout<<dis[i]<<" ";
    64. }
    65. return 0;
    66. }

单源最短路问题 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 glance 镜像服务 (五)

    Openstack glance 镜像服务 (五) 引用: 官方文档glance安装 https://docs.openstack.org/ocata/zh_CN/install-guide-rdo/ ...

  2. 【Linux】reverse mapping checking getaddrinfo for XXX.XXXX.com failed - POSSIBLE BREAKIN ATTEMPT!

    ------------------------------------------------------------------------------------------------- | ...

  3. 【Linux】saltstack 安装及简单使用

    准备三台server,一台为master(10.96.20.113),另两台为minion(10.96.20.117,10.96.20.118) 主机名(master.minion1.minion2) ...

  4. 目录遍历 - Pikachu

    概述: 在web功能设计中,很多时候我们会要将需要访问的文件定义成变量,从而让前端的功能便的更加灵活. 当用户发起一个前端的请求时,便会将请求的这个文件的值(比如文件名称)传递到后台,后台再执行其对应 ...

  5. bash shell数组使用总结

    本文为原创博文,转发请注明原创链接:https://www.cnblogs.com/dingbj/p/10090583.html  数组的概念就不多说了,大家都懂! shell数组分为索引数组和关联数 ...

  6. 跨平台导PDF,结合wkhtmltopdf很顺手

    前言 好东西要分享,之前一直在使用wkhtmltopdf进行pdf文件的生成,常用的方式就是先安装wkhtmltopdf,然后在程序中用命令的方式将对应的html生成pdf文件,简单而且方便:但重复的 ...

  7. React 入门-redux 和 react-redux

    React 将页面元素拆分成组件,通过组装展示数据.组件又有无状态和有状态之分,所谓状态,可以简单的认为是组件要展示的数据.React 有个特性或者说是限制单向数据流,组件的状态数据只能在组件内部修改 ...

  8. Django-html文件实例

    1.实例1,登陆界面 <!DOCTYPE html> <head> <meta http-equiv="content-type" content=& ...

  9. synchronized的jvm源码分析聊锁的意义

    上篇写完了ReentrantLock源码实现,从我们的角度分析设计锁,在对比大神的实现,顺道拍了一波道哥的马屁,虽然他看不到,哈哈.这一篇我们来聊一聊synchronized的源码实现,并对比reen ...

  10. code-server Command ' ' not found

    由于通过一些特殊的方式登录linux用户后,全局变量不会自动加载,需要在 vscode 的 bash terminal手动读取 输入 source /etc/profile 或者vim ~/.bash ...