SPFA的队列优化模板

13人阅读 评论(0) 收藏 举报
分类:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<set>
#include<queue>
using namespace std;
#define INF 0x3f3f3f3f
#define M(a, b) memset(a, b, sizeof(a))
const int maxn = 1000 + 5;

struct Edge {
    int from, to, dist;
};

struct SPFA {
    int d[maxn], cnt[maxn], p[maxn];
    int n, m;
    bool inq[maxn];
    vector<int> G[maxn];
    vector<Edge> edges;

    void init(int n) {
        this->n = n;
        for (int i = 1; i <= n; ++i) G[i].clear();
        edges.clear();
    }

    void AddEdge(int from, int to, int dist) {
        edges.push_back(Edge{from, to, dist});
        int m = edges.size();
        G[from].push_back(m-1);
    }

    bool spfa(int s) {
        M(d, INF); M(cnt, 0); M(inq, 0);
        d[s] = 0;
        queue<int> q;
        q.push(s);
        inq[s] = true;
        while (!q.empty()) {
            int u = q.front(); q.pop();
            inq[u] = false;
            for (int i = 0; i < G[u].size(); ++i) {
                Edge &e = edges[G[u][i]];
                if (d[e.to] > d[u] + e.dist) {
                    d[e.to] = d[u] + e.dist;
                    p[e.to] = G[u][i];
                    if (!inq[e.to]) {
                        q.push(e.to); inq[e.to] = true; 
                        if (++cnt[e.to] > n) return false;
                    }
                }
            }
        }
        return true;
    }

};

SPFA solver;

int main() {
    int n, m, a, b, c;
    while(cin >> m >> n) {
        solver.init(n);
        while(m--) {
            cin >> a >> b >> c;
            solver.AddEdge(a, b, c);
            solver.AddEdge(b, a, c);
        }
        solver.spfa(1);
        cout << solver.d[n] << endl;
    }
    return 0;
}
查看评论

WordPress博客模板系统开发

-
  • 1970年01月01日 08:00

SPFA——基于Bellman-Ford的队列优化

Bellman-Ford算法在每一次实施松弛操作时,就会有一些顶点已经求得最短路径,此后这些顶点的最短路径的估计值就会一直保持不变,不再受后续松弛操作的影响,但是每次还要判断是否需要松弛,这里浪费了大...
  • triumph92
  • triumph92
  • 2014-12-05 16:15:08
  • 910

一个我认为比较好的Spfa模板(使用邻接表和队列实现)

int N, X; //N为点数 X为源点 int head[MAXN]; //head[src]表示以head为出发点的邻接表表头在数组Adj中的位置,开始时所有元素初始化为-1 int nodeP...
  • u011646353
  • u011646353
  • 2015-05-16 22:02:34
  • 892

有限制的最短路spfa+优先队列

poj1724
  • u012859437
  • u012859437
  • 2014-08-01 17:23:39
  • 853

【原创】最短路模板 Floyd,优先队列优化dijkstra,SPFA

天天高高兴兴打打模板``` #include #include #include #include #include #include using namespace std; con...
  • c20182030
  • c20182030
  • 2017-10-25 14:11:30
  • 117

SPFA的两种优化SLF和LLL

记下SPFA的两种优化,大牛请无视SPFA算法有两个优化算法 SLF 和 LLL: SLF:Small Label First 策略,设要加入的节点是j,队首元素为i,若dist(j) < dis...
  • oranges_c
  • oranges_c
  • 2017-03-20 12:57:35
  • 3345

[模板]spfa+邻接表

就是用了前向星来储存这个图 进行spfa时可以少进行很多次判断type arr=record x,y,w,next:longint; end; var edge:...
  • Nidhogg__
  • Nidhogg__
  • 2016-08-19 11:53:55
  • 556

SPFA以及其优化

SPFA(Shortest Path Faster Algorithm)是Bellman-Ford算法的一种队列实现,减少了不必要的冗余计算。 SPFA,要从Bellman-ford的优化说起。...
  • liangzhaoyang1
  • liangzhaoyang1
  • 2017-03-16 15:06:47
  • 1716

codevs 2273 扬帆远洋大战牧师妹酱 SPFA双端队列优化

根据计算机的计算结果,这N个地点大多都是非常偏僻的城镇。因此,之间的道路并不定都是畅通的。这些地区之间通过R条道路连接,为了使得之间前往的方便,扬帆远洋TEL还帮助扬帆远洋产生了P个空间隧道,扬帆远洋...
  • Loi_a
  • Loi_a
  • 2016-03-24 11:50:28
  • 922

SPFA算法及前向星优化

先说说spfa算法: SPFA算法 来自"NOCOW" 算法简介 SPFA(Shortest Path Faster Algorithm)是Bellman-Ford算法的一种队列实现,减少...
  • allenjy123
  • allenjy123
  • 2010-11-21 22:29:00
  • 1621
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 14万+
    积分: 5314
    排名: 6398
    博客专栏