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号
浙公网安备 33010602011771号