spfa

SPFA: Shortest Path Faster Algorithm

  • 看到名字不禁为之一颤,SPFA算法是西南交通大学段凡丁于1994年发表的。
  • SPFA 也是竞赛中最常见的算法之一,不仅仅用来解决带负权的单源最短路
  • 而且是求解差分约束问题的专用算法,也常用它和最大流合作解决最小费问题

  • SPFA 算法的最坏复杂度为 O(2*E)。。

  • SPFA 和dijkstra 格式很接近,只是加了个队列或栈就变得无比神奇了。

  • 这里用邻接表形式写下spfa 的模板

  • 后面再介绍它的其它功能,这里只知道它处理最短路很快即可

    优点

  • 可以处理负权,判负环,快

    代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    queue<int> q;
    int spfa(int s,int t){
    memset(d,0x3f,sizeof(d));
    memset(in,0,sizeof(vis));
    //memset(c,0,sizeof(c));
    q.push(s);
    in[s]=1;
    //c[s]=1;
    while(!q.empty()){
    int k=q.front();q.pop();
    in[k]=0;
    for(int i=head[k];i!=-1;i=e[i].nxt)if(d[k]+e[i]<d[i]){
    d[i]=e[i].w+d[k];
    if(!in[e[i].t]){
    q.push(e[i].t);
    in[e[i].t]++;
    c[e[i].t]++;
    //if(c[e[i].t]>n)return ok=0
    }
    }
    }
    }