Dijkstra

引用自:点击打开链接

  1. #include <algorithm>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <functional>
  5. #include <iostream>
  6. #include <queue>
  7. #include <vector>
  8. using namespace std;
  9. const int maxn = + ;
  10. typedef pair<int, int> pii;
  11. struct Edge {
  12. int to, weight;
  13. Edge(int to, int weight) : to(to), weight(weight) {}
  14. };
  15. vector<vector<Edge>> G(MAXN); //更快
  16. struct Dijkstra { //打包在Dijkstra中
  17. int n, m;
  18. int dist[MAXN];
  19. int p[MAXN];
  20. Dijkstra(int n) : n(n) {
  21. for (int i = ; i <= n; i++) G[i].clear();
  22. }
  23. void AddEdge(int from, int to, int weight) {
  24. G[from].push_back(Edge(to, weight)); //保存from出发的边
  25. }
  26. void dijkstra(int s) {
  27. priority_queue<pii, vector<pii>, greater<pii>> Q;
  28. memset(dist, 0x7f, sizeof(dist)); //初始化为无穷大
  29.  
  30. dist[s] = ;
  31. Q.push(pii(, s)); // pii (dist ,u)
  32. while (!Q.empty()) {
  33. pii P = Q.top();
  34. Q.pop();
  35. int u = P.second, d = P.first;
  36. Q.pop();
  37. if (dist[u] < d) continue;
  38. for (int i = ; i < G[u].size(); i++) {
  39. Edge& e = G[u][i];
  40. int v = e.to, w = e.weight;
  41. if (dist[v] > dist[u] + w) {
  42. dist[v] = dist[u] + w;
  43. p[v] = u; //记录到各点的最短路径
  44. Q.push(pii(dist[v], v));
  45. }
  46. }
  47. }
  48. }
  49. };
  50. int main() {
  51. int n, m, u, v, w;
  52. cin >> n >> m; // n 点 , m 边
  53. Dijkstra d(n);
  54. for (int i = ; i < m; i++) {
  55. scanf("%d%d%d", &u, &v, &w);
  56. d.AddEdge(u, v, w);
  57. d.AddEdge(v, u, w);
  58. }
  59. d.dijkstra(); // 1点出发
  60. cout << d.dist[n] << endl; //到n的最短路径
  61.  
  62. vector<int> ans; //到n点的最短路径
  63. for (int i = n; i != ; i = d.p[i]) ans.push_back(i);
  64. ans.push_back();
  65. for (int i = ans.size() - ; i >= ; i--) cout << ans[i] << ' ';
  66.  
  67. return ;
  68. }

SPFA,向前星储存

  1. struct Edge{
  2. int from, to, w, next;
  3. }e[];
  4. int head[MAXN],vis[MAXN];
  5. int dist[MAXN];
  6. int n, m, tot;
  7.  
  8. void add_edge(int i, int j, int w) {
  9. e[tot].from = i, e[tot].to = j, e[tot].w = w;
  10. e[tot].next = head[i]; head[i] = tot++;
  11. }
  12.  
  13. void SPFA(int s){
  14. queue <int> q;
  15. for (int i = ; i <= n; i++)
  16. dist[i] = INF;
  17. memset(vis, false, sizeof(vis));
  18. q.push(s);
  19. dist[s] = ;
  20. while (!q.empty()){
  21. int u = q.front();
  22. q.pop();
  23. vis[u] = false;
  24. for (int i = head[u]; i != -; i = e[i].next){
  25. int v = e[i].to;
  26. if (dist[v] > dist[u] + e[i].w){
  27. dist[v] = dist[u] + e[i].w;
  28. if (!vis[v]){
  29. vis[v] = true;
  30. q.push(v);
  31. }
  32. }
  33. }
  34. }
  35. }

Dijkstra+SPFA 模板的更多相关文章

  1. 最短路径---dijkstra算法模板

    dijkstra算法模板 http://acm.hdu.edu.cn/showproblem.php?pid=1874 #include<stdio.h> #include<stri ...

  2. SPFA模板 Bellmanford优化版

    SPFA模板: queue<int>Q; ]; ],sumv[]; *],__next[*],e,w[*],first[],cnts[]; void AddEdge(int U,int V ...

  3. floyed dij spfa 模板

    /* SPFA模板 */ const int inf=0x3f3f3f3f; inline int SPFA(int s){ memset(dis,inf,sizeof(dis)); queue< ...

  4. 图的最短路径算法Dijkstra算法模板

    Dijkstra算法:伪代码 //G为图,一般设为全局变量,数组d[u]为原点到达个点的额最短路径, s为起点 Dijkstra(G, d[u], s){ 初始化: for (循环n次){ u = 是 ...

  5. POJ2387 Til the Cows Come Home(SPFA + dijkstra + BallemFord 模板)

    Til the Cows Come Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 37662   Accepted ...

  6. Dijkstra堆优化与SPFA模板

    Dijkstra+优先队列 #include<cstdio> #include<cctype> #include<queue> #include<cstrin ...

  7. 几个小模板:topology, dijkstra, spfa, floyd, kruskal, prim

    1.topology: #include <fstream> #include <iostream> #include <algorithm> #include & ...

  8. dijkstra spfa prim kruskal 总结

    最短路和最小生成树应该是很早学的,大家一般都打得烂熟,总结一下几个问题 一  dijkstra  O((V+E)lgV) //V节点数 E边数 dijkstra不能用来求最长路,因为此时局部最优解已经 ...

  9. hdu-2544-最短路(SPFA模板)

    题目链接 题意很清晰,入门级题目,适合各种模板,可用dijkstra, floyd, Bellman-ford, spfa Dijkstra链接 Floyd链接 Bellman-Ford链接 SPFA ...

随机推荐

  1. qt连接mysql数据库实例

    qt5.2版本已经封装进去了mysql驱动,所以省去了我们现编译的麻烦!!! #include <QCoreApplication> #include <QDebug> #in ...

  2. gentoo在KVM+QEMU中安装笔记

    gentoo是比较难安装的,本笔记主要是记录本次安装过程,以备参考. 1.首先,下载镜像,可以去国内各大镜像网站下载,我选择的是清华的镜像源:https://mirrors.tuna.tsinghua ...

  3. tomcat-windows10环境搭建

    1.进入Tomcat官网Apache Tomcat® - Welcome! 2.根据操作系统选择合适的版本下载 zip用于windows操作系统, tar.gz用于unix和linux操作系统 Bin ...

  4. 在 Vs2013中查看类的内部布局

    第一步:在Visual Studio中配置命令行环境(Command Prompt) 来自:https://blog.csdn.net/u013553529/article/details/77417 ...

  5. Leetcode面试题17.20_连续中值

    题目地址 实现一个数列的动态添加和查询中位数. 复杂点的话应该可以写个平衡树什么的,然后查询第k大,还可以删除数字. 简单点的话显然可以维护两个堆,一个大顶堆一个小顶堆,而且大顶堆最多比小顶堆多一个, ...

  6. 一文彻底搞懂 TCP三次握手、四次挥手过程及原理

    原创文章出自公众号:「码农富哥」,欢迎收藏和关注,如转载请注明出处! TCP 协议简述 TCP 提供面向有连接的通信传输,面向有连接是指在传送数据之前必须先建立连接,数据传送完成后要释放连接. 无论哪 ...

  7. junit测试的介绍和应用

    目录 1.junit测试简介 2.运行环境 3.测试过程 1.junit测试简介 JUnit是一个Java语言的单元测试框架.它由Kent Beck和Erich Gamma建立,逐渐成为源于Kent ...

  8. NCE L3

    单词 课文

  9. js—求数组中的最大最小值

    参考链接:https://www.w3cplus.com/javascript/calculate-the-max-min-value-from-an-array.html Math.min.appl ...

  10. 手把手教你使用数据可视化BI软件创建仓库可视化管理大屏

    灯果数据可视化BI软件是新一代人工智能数据可视化大屏软件,内置丰富的大屏模板,可视化编辑操作,无需任何经验就可以创建属于你自己的大屏.大家可以在他们的官网下载软件.   本文以仓库可视化管理大屏为例为 ...