#include <iostream> #include <cstring> using namespace std; const int N = 1000010, M = 2000010; const int INF = 0x3f3f3f3f; int n, m, s, t; int h[N], e[M], ne[M], w[M], idx; int dist[N]; bool st[N]; int cnt[N]; int q[N]; void add(int a, int b, int c){ e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx ++; } bool spfa(){ memset(dist, 0x3f, sizeof dist); dist[s] = 0; int hh = 0, tt = 0; q[tt ++ ] = s; st[s] = true; while (hh != tt) { int t = q[hh ++ ]; if (hh == N) hh = 0; st[t] = false; for (int i = h[t]; ~i; i = ne[i]) { int j = e[i]; if (dist[j] > dist[t] + w[i]) { dist[j] = dist[t] + w[i]; cnt[j] = cnt[t] + 1; if (cnt[j] >= n) return false; if (!st[j]) { q[tt ++ ] = j; if (tt == N) tt = 0; st[j] = true; } } } } return true; } int main(){ scanf("%d%d%d%d", &n, &m, &s, &t); memset(h, -1, sizeof h); while (m--) { int a, b, c; scanf("%d%d%d", &a, &b, &c); add(a, b, c); add(b, a, c); } if (spfa()) cout << dist[t] << endl; else puts("无解"); return 0; }用BFS加双端队列的方法实现这个代码
时间: 2024-03-04 14:53:01 浏览: 68
c++编写程序,实现字符串的逆序输出
这段代码实现的是求解无向图中单源最短路径问题的 SPFA 算法,你的问题是要求使用 BFS 加双端队列的方法实现这段代码,那么我来简单讲一下这个过程。
在使用 BFS 加双端队列实现 SPFA 算法时,我们需要用一个双端队列(deque)来维护当前已经更新过的点集合。SPFA 的基本思想是从起点开始,不断松弛所有边,如果某个点的最短路被更新,则将其加入队列中,然后继续松弛其相邻的边。
具体实现时,我们可以维护一个双端队列 $q$,初始时将起点 $s$ 加入队列中。然后每次从队列的两端取出一个点 $t$,遍历其所有相邻的点 $j$,如果从 $s$ 到 $j$ 的距离可以通过从 $s$ 到 $t$ 的距离加上边权 $w_{tj}$ 来更新,则更新 $dist_j$ 并将其加入队列中。注意,如果 $j$ 已经被加入队列中,就不需要再次加入了。
具体实现细节可以参考下面的代码:
阅读全文