使用FIFO队列实现:
bool bellman_ford(int s){
queue<int > Q;
memset(inq,0,sizeof(inq));
memset(cnt,0,sizeof(cnt));
for(int i=0;i<n;i++) d[i]=INF;///初始化
d[s]=0;///起点设为0
inq[s]=true;///在队列中
Q.push(s); while(!Q.empty()) {
int u=Q.front();Q.pop();
inq[u]=false;
for(int i=0;i<G[u].size(); i++){///查找与u相连的边
Edge& e=edges[G[u][i]];///取相连边
if(d[u]<INF&&d[e.to]>d[u]+e.dist){///若u是路径中的边且到i的路径比原路径权值小,则加入路径
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;
}