最短路径SPFA

实现方法:
  建立一个队列,初始时队列里只有起始点,再建立一个表格记录起始点到所有点的最短路径(该表格的初始值要赋为极大值,该点到他本身的路径赋为0)。然后执行松弛操作,用队列里有的点作为起始点去刷新到所有点的最短路,如果刷新成功且被刷新点不在队列中则把该点加入到队列最后。重复执行直到队列为空。

判断有无负环:
  如果某个点进入队列的次数超过N次则存在负环(SPFA无法处理带负环的图)

int SPFA()
{
   queue<int> q;
   q.push(1);
   flag[1]=1;
   while (!q.empty())
   {
       int u = q.front();
       q.pop();
       for (int i = head[u]; i; i = nxt[i])
       {
           int v=to[i];
           if (dist[v] > dist[u] + w[i])
           {
               dist[v] = dist[u] + w[i];
               if (!flag[v])
               {
                   q.push(v);
                   flag[v] = 1;
               }
           }
       }
       flag[u] = 0;
   }
}
posted @ 2025-01-20 19:15  流氓兔LMT  阅读(14)  评论(0)    收藏  举报