图论-SPFA算法

//大致的思路如下:
queue<int>q;
源点 s 入队; 
while(!q.empty())
{
    取出队首元素u;
    for(u的所有邻接边u->v)
    {
        if(d[u]+dis<d[v])
        {
            d[v]=d[u]+dis;
            if(v不在队列当中)
            {
                v入队;
                if(v入队的次数大于n-1)
                {
                    说明有负环 return false; 
                } 
            } 
        }
    } 
} 


//具体的实现:
vector<Node>Adj[MAXV];
int n,d[MAXV],num[MAXV];
bool vis[MAXV];
bool SPFA(int s)
{
    memset(vis,0,sizeof(s));
    memset(num,0,sizeof(num));
    fill(d,d+MAXV,INF);
    queue<int>Q;
    Q.push(s);
    vis[s]=true;
    num[s]++;
    d[s]=0;
    while(Q.empty())
    {
        int u=Q.front();
        Q.pop();
        vis[u]=false;
        for(int j=0;j<A[u].size();j++)
        {
            int v=A[u][j].v;
            int dis=Adj[u][j].dis;
            if(d[u]+dis<d[v])
            {
                d[v]=d[u]+dis;
                if(vis[v]==false)
                {
                    Q.push(v);
                    vis[v]=true;
                    num[v]++;
                    if(num[v]>=n) return false;
                }
            }
        }
    }
    return true;
}
原文地址:https://www.cnblogs.com/zuimeiyujianni/p/8847458.html