最短路算法之SPFA算法

来源:互联网 发布:淘宝V6会员贷款 编辑:程序博客网 时间:2024/06/07 07:07

SPFA(Shortest Path Faster Algorithm)算法自然有它的过人之处,它是BELLMAN-FORD算法的一种优化版本,一般认为算法复杂度为O(E)就好了 (其实我也不知道是O几)。

算法思想就是把源点加入队列,然后从队列里不断取出队首,用队首相关的边去松弛,若能松弛,则把被松弛的边的另一个端点加入队列(若已经在队列里就不用加了),如此反复知道队列为空。

vector<int>g[N], e[N];queue<int>q;bool in[N];int dis[N];void add(int u, int v, int c){g[u].push_back(v);e[u].push_back(c);}int spfa(int s, int t){memset(in, false, sizeof in);memset(dis, 0x3f, sizeof dis);q.push(s);in[s] = true;dis[s] = 0;while (!q.empty()){int u = q.front(); q.pop();//记得消去in标志in[u] = false;for (int i = 0; i < g[u].size(); i++){int v = g[u][i], c = e[u][i];if (dis[v]>dis[u] + c){dis[v] = dis[u] + c;if (!in[v]){q.push(v);//记得带上in标志in[v] = true;}}}}return dis[t];}


0 0