题解:#7655.有负权边的最短路 审核通过

Teacher_wang 因为他善 2024-12-21 17:03:41 4

为什么使用spfa

最短路算法: 1.dijkstra 2.floyd 3.spfa 本题是求单源最短路,而且存在负边,所以应该用spfa

spfa原理

若给定的图存在负权边,类似Dijkstra算法等算法便没有了用武之地,SPFA算法便派上用场了。简洁起见,约定加权有向图G不存在负权回路,即最短路径一定存在。用数组d记录每个结点的最短路径估计值,而且用邻接表来存储图G。SPFA采取的方法是动态逼近法:设立一个先进先出的队列用来保存待优化的结点,优化时每次取出队首结点u,并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作,如果v点的最短路径估计值有所调整,且v点不在当前的队列中,就将v点放入队尾。这样不断从队列中取出结点来进行松弛操作,直至队列空为止。

spfa核心代码

// spfa
memset(d, 0x3f, sizeof(d));
d[1] = 0;
q.push(1);
f[1] = true;
while (!q.empty()) {
    int u = q.front();
    for (int i = pre[u]; i != 0; i = a[i].next) {
         int v = a[i].to;
         if (d[u] + a[i].len < d[v]) {
              d[v] = d[u] + a[i].len;
              if (!f[v]) {
                   q.push(v);
                   f[v] = true;
              }
          }
    }
    q.pop();
    f[u] = false;
}
{{ vote && vote.total.up }}