欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

模板 - SPFA

程序员文章站 2022-03-01 15:05:14
...

SPFA可以用来判断负环或者计算带负权的最短路
其实带负权的最短路可以用带势Dijkstra计算……

所以SPFA基本就拿来判负环了……

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;


namespace SPFA{
    const int MAXN=5010;
    const int MAXM=10010;
    const int INF=0x3f3f3f3f;

    int tol;
    int head[MAXN];
    struct Edge{
        int to,next,cost;
    }edge[MAXM];

    void init(){
        tol=1;
        memset(head,-1,sizeof(head));
    }

    void add_edge(int u,int v,int cost){
        edge[tol].to=v;
        edge[tol].cost=cost;
        edge[tol].next=head[u];
        head[u]=tol++;
    }

    bool vis[MAXN];
    int cnt[MAXN];
    int dist[MAXN];

    bool spfa(int s,int n){
        memset(vis,0,sizeof(vis));
        memset(cnt,0,sizeof(cnt));
        memset(dist,0x3f,sizeof(dist));

        queue<int>que;
        while(!que.empty())que.pop();
        que.push(s);
        vis[s]=true;
        cnt[s]=1;
        dist[s]=0;

        while(!que.empty()){
            int u=que.front();
            que.pop();
            vis[u]=false;
            for(int i=head[u];i!=-1;i=edge[i].next){
                int v=edge[i].to;
                if(dist[v]>dist[u]+edge[i].cost){
                    dist[v]=dist[u]+edge[i].cost;
                    if(!vis[v]){
                        vis[v]=true;
                        que.push(v);
                        if(++cnt[v]>n){
                            return false;
                        }
                    }
                }
            }
        }
        return true;
    }

}


using namespace SPFA;