zoukankan      html  css  js  c++  java
  • Dijkstra+SPFA 模板

    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 = 100000 + 5;
    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 = 1; 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] = 0;
    31         Q.push(pii(0, 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 = 0; 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 = 0; 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);              // 1点出发
    60     cout << d.dist[n] << endl;  //到n的最短路径
    61 
    62     vector<int> ans;  //到n点的最短路径
    63     for (int i = n; i != 1; i = d.p[i]) ans.push_back(i);
    64     ans.push_back(1);
    65     for (int i = ans.size() - 1; i >= 0; i--) cout << ans[i] << ' ';
    66 
    67     return 0;
    68 }

    SPFA,向前星储存

     1 struct Edge{
     2     int from, to, w, next;
     3 }e[1000001];
     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 = 1; i <= n; i++)
    16         dist[i] = INF;
    17     memset(vis, false, sizeof(vis));
    18     q.push(s);
    19     dist[s] = 0;
    20     while (!q.empty()){
    21         int u = q.front();
    22         q.pop();
    23         vis[u] = false;
    24         for (int i = head[u]; i != -1; 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 }
  • 相关阅读:
    PHP 数据类型
    PHP SAPI
    PHP 基础架构
    PHP7的变化
    mysql 选择优化的数据类型需要注意的几点
    彻底删除在github上提交的文件
    php7 新特性
    php缓冲区 一些笔记
    设计模式 一些概念
    mysql性能优化其中一部分小结
  • 原文地址:https://www.cnblogs.com/romaLzhih/p/9565832.html
Copyright © 2011-2022 走看看