SPFA算法模板(实际上是bellman-ford) 的队列优化

#include <cstdio> #include <iostream> #include <algorithm> #include <queue> #include <vector> #include <cstring> using namespace std; const int maxn = 100; const int inf = 0x3f3f3f3f; int n,m; struct node { int x;int d; node(){}; node(int xx,int dd):x(xx),d(dd){}; }; vector<node>edge[maxn]; int book[maxn]; int ds[maxn]; void bfs() { for(int i = 0;i <= n;i++) ds[i] = inf; ds[1] = 0; memset(book,0,sizeof(book)); queue<node>q; node now,ne; q.push(node(1,ds[1])); book[1] = 1;///这个程序以1 为起点开始 while(!q.empty()) { now = q.front();///当前需要处理的队首元素 q.pop(); for(int i = 0;i < edge[now.x].size();i++) { node y = edge[now.x][i]; if(ds[y.x] > now.d+y.d) { ds[y.x] = ds[now.x]+y.d;///注意,dijkstra 是 ds[y.x] = now.d + y.d; 注意区别 if(book[y.x] == 0) { q.push(y); book[y.x]=1; } } } book[now.x] = 0; } } int main() { cin >> n >> m; int a,b,d; for(int i = 1;i <= m;i++) { cin >> a >> b >> d; edge[a].push_back(node(b,d)); edge[b].push_back(node(a,d)); } bfs(); for(int i = 1;i <= n;i++) cout << ds[i] << " "; return 0; } /** 5 7 1 2 2 1 5 10 2 3 3 2 5 7 3 4 4 4 5 5 5 3 6 --->0 2 5 9 9 **/

    原文作者:Bellman - ford算法
    原文地址: https://blog.csdn.net/lidafoye/article/details/76408273
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞