优化的Bellman_Ford算法
- 因为Bellman_Ford的时间复杂度O(VE).当Bellman_Ford中的顶点被松弛时,与之相连的顶点才有可能被松弛。因此,可以维护一个队列。当队列中的v被松弛时,将v入队(对其的邻接点操作)。当某个结点v入队次数超过v-1说明,此时有负环。
- O(kE)k是一个常数,一般不超过2
伪代码
queue<int>q;
q.pushback(s);//源点入队
while (!q.empty())
{
取出队首元素u;
for (u的所有邻接边u->v)
{
if (d[u] + dis < d[v])
{
d[v] = d[u] + dis;
if (v不在队列中)
v入队;
if (v入队次数超过n - 1)
//存在可达负环
return;
}
}
}