Bellman-Ford算法
Bellman-Ford算法是用于求出包含负权边的图的单源最短路,当存在负环返回错误信息,否则给出原点到各点的最短路,复杂度为O(nm)
其原理就是利用FIFO队列不断对可能边进行松弛操作,每当新松弛了一条边,将这条边加入队列。
bool Bellman_Ford()
{
queue<int> Q;
Q.push(1);
memset(cnt,0,sizeof(cnt));
memset(inq,0,sizeof(inq));
rep(i,1,n) d[i]=INF;
d[1]=0;
while (!Q.empty())
{
x=Q.front(); Q.pop(); inq[x]=0;
rep(i,0,sz(G[x])-1)
{
int v=G[x][i].v,val=G[x][i].val;
if (d[v]>(d[x]+val))
{
d[v]=d[x]+val;
if (!inq[v])
{
Q.push(v),cnt[v]++,inq[v]=1;
if (cnt[v]>n) return false;
}
}
}
}
return true;
}

浙公网安备 33010602011771号