spfa算法(FIFO优化的BellmanFord算法)

spfa算法用FIFO队列代替BellmanFord算法的循环检查,所以在效率上是相当不错的;


struct Edge
{
    int from;//出发结点
    int to;//终止结点
    int dist;//距离
    Edge(int u,int v,int d):from(u),to(v),dist(d){}
};

//一些重要的参数和初始化
int n;//n为结点数
int m;//m为边的编号
vector edges;
vector G[maxn];
int d[maxn];//源点到各个点的距离
int p[maxn];//最短路中的上一条弧

void init(int n)
{
    this->n=n;
    for(int i=0;i Q;
    memset(inq,0,sizeof(inq));//inq[]代表是否已经在队列中
    memset(cnt,0,sizeof(cnt));//cnt[]代表进入队列几次
    for(int i=0;id[u]+e.dist)
            {
                d[e.to]=d[u]+e.dist;
                p[e.to]=G[u][i];
                if(!inq[e.to])
                {
                    Q.push(e.to);
                    inq[e.to]=true;
                    if(++cnt[e.to]>n)
                        return false;
                }
            }
        }
    }
    return true;
}


你可能感兴趣的:(图论)