模板 - SPFA

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;
posted @ 2019-04-15 00:19  韵意  阅读(165)  评论(0编辑  收藏  举报