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];
}