• 【算法3.5】Dijkstra求最短路(完结)


    目录

    朴素 - 模板

    堆优化模板

    一、849. 朴素Dijkstra算法

    二、850. Dijkstra求最短路 II


    朴素 - 模板

    1. int dijkstra()
    2. {
    3. memset(dist,0x3f,sizeof dist);
    4. dist[1]=0; //起点到自身的距离为0
    5. for(int i=0;i
    6. {
    7. int t=-1; //t=-1的作用是可以找出第一个点
    8. for(int j=1;j<=n;j++) //从1号点开始
    9. if(!st[j]&&(t==-1||dist[t]>dist[j])) //从未标记的节点中选择距离起点最近的节点
    10. t=j;
    11. st[t]=true;
    12. for(int j=1;j<=n;j++) //用已确定了的最短距离的点来更新到其他点的最短距离
    13. dist[j]=min(dist[j],dist[t]+g[t][j]);
    14. }
    15. if(dist[n]==0x3f3f3f3f) return -1;
    16. return dist[n];
    17. }

    堆优化模板

    1. int dijkstra()
    2. {
    3. memset(dist,0x3f,sizeof dist);
    4. dist[1]=0;
    5. priority_queue,greater>heap;
    6. heap.push({0,1});//顺序不能倒 pair排序时是先根据first 再根据second 这里显然要根据距离排序
    7. while(heap.size())
    8. {
    9. auto t=heap.top();
    10. heap.pop();
    11. int x=t.second,d=t.first;
    12. if(st[x]) continue;
    13. st[x]=true;
    14. for(int i=h[x];i!=-1;i=ne[i])
    15. {
    16. int j=e[i];
    17. if(dist[j]>d+w[i])
    18. {
    19. dist[j]=d+w[i];
    20. heap.push({dist[j],j});
    21. }
    22. }
    23. }
    24. if(dist[n]==0x3f3f3f3f) return -1;
    25. return dist[n];
    26. }

    一、849. 朴素Dijkstra算法

     

    活动 - AcWing

    给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为正值。

    请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 nn 号点,则输出 −1。

    输入格式

    第一行包含整数 n 和 m。

    接下来 m 行每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。

    输出格式

    输出一个整数,表示 1 号点到 n 号点的最短距离。

    如果路径不存在,则输出 −1。

    数据范围

    1≤n≤500
    1≤m≤105
    图中涉及边长均不超过10000。

    输入样例:

    1. 3 3
    2. 1 2 2
    3. 2 3 1
    4. 1 3 4

    输出样例:

    3
    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. const int N=510;
    6. int n,m;
    7. int g[N][N]; //稠密图用邻接矩阵存
    8. int dist[N]; //用于存储每个点到起点的最短距离
    9. bool st[N]; //用于在更新最短距离时 判断当前的点的最短距离是否确定 是否需要更新
    10. int dijkstra()
    11. {
    12. memset(dist,0x3f,sizeof dist);
    13. dist[1]=0; //起点到自身的距离为0
    14. for(int i=0;i
    15. {
    16. int t=-1; //t=-1的作用是可以找出第一个点
    17. for(int j=1;j<=n;j++) //从1号点开始
    18. if(!st[j]&&(t==-1||dist[t]>dist[j])) //从未标记的节点中选择距离起点最近的节点
    19. t=j;
    20. st[t]=true;
    21. for(int j=1;j<=n;j++) //用已经确定了的最短距离的点来更新到其他点的最短距离
    22. dist[j]=min(dist[j],dist[t]+g[t][j]);
    23. }
    24. if(dist[n]==0x3f3f3f3f) return -1;
    25. return dist[n];
    26. }
    27. int main()
    28. {
    29. cin>>n>>m;
    30. memset(g,0x3f,sizeof g);//初始化图 因为是求最短路径 所以每个点初始为无限大
    31. while(m--)
    32. {
    33. int x,y,z;
    34. cin>>x>>y>>z;
    35. g[x][y]=min(g[x][y],z); //如果发生重边的情况则保留最短的一条边
    36. }
    37. cout<<dijkstra()<
    38. return 0;
    39. }

    二、850. 堆优化Dijkstra算法

    题目同上

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. typedef pair<int, int> PII;//<离起点的距离,节点编号>
    7. const int N=1e6+10;
    8. int n,m;
    9. int h[N],w[N],e[N],ne[N],idx; //稀疏图用邻接表存
    10. int dist[N]; //用于存储每个点到起点的最短距离
    11. bool st[N];
    12. void add(int a,int b,int c)
    13. {
    14. e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
    15. }
    16. int dijkstra()
    17. {
    18. memset(dist,0x3f,sizeof dist);
    19. dist[1]=0;
    20. priority_queue,greater>heap;
    21. heap.push({0,1});//顺序不能倒 pair排序时是先根据first 再根据second 这里显然要根据距离排序
    22. while(heap.size())
    23. {
    24. auto t=heap.top();
    25. heap.pop();
    26. int x=t.second,d=t.first;
    27. if(st[x]) continue;
    28. st[x]=true;
    29. for(int i=h[x];i!=-1;i=ne[i])
    30. {
    31. int j=e[i];
    32. if(dist[j]>d+w[i])
    33. {
    34. dist[j]=d+w[i];
    35. heap.push({dist[j],j});
    36. }
    37. }
    38. }
    39. if(dist[n]==0x3f3f3f3f) return -1;
    40. return dist[n];
    41. }
    42. int main()
    43. {
    44. cin>>n>>m;
    45. memset(h,-1,sizeof h);
    46. while(m--)
    47. {
    48. int a,b,c;
    49. cin>>a>>b>>c;
    50. add(a,b,c);
    51. }
    52. cout<<dijkstra()<
    53. return 0;
    54. }

  • 相关阅读:
    Java21中的新特性虚拟线程详解
    Python之numpy函数
    基于51单片机酒精浓度检测仪超限报警Proteus仿真
    区块链隐私计算中的密码学原理及应用(1)
    Rust 基础再理解
    02-WPF_基础(二)
    STL技巧大赏
    目标检测:Anchor-free算法模型
    spring boot 接入prometheus+grafana监控API
    使用ffmpeg调用电脑自带的摄像头和扬声器录制音视频
  • 原文地址:https://blog.csdn.net/weixin_61639349/article/details/126269009