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

来源:互联网 发布:demo软件是什么意思 编辑:程序博客网 时间:2024/05/22 08:13

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<Edge> edges;vector<int> G[maxn];int d[maxn];//源点到各个点的距离int p[maxn];//最短路中的上一条弧void init(int n){    this->n=n;    for(int i=0;i<n;++i)    {        G[i].clear();    }    edges.clear();}void AddEdge(int from,int to,int dist){    edges.push_back(Edge(from,to,dist));    m=edges.size();    //把边的编号压入,相当于邻接表    G[from].push_back(m-1);}bool bellman_ford(int s)//s为源点{    queue<int> Q;    memset(inq,0,sizeof(inq));//inq[]代表是否已经在队列中    memset(cnt,0,sizeof(cnt));//cnt[]代表进入队列几次    for(int i=0;i<n;++i)        d[i]=INF; //d[i]为到源点的距离    d[s]=0;    inq[s]=true;    Q.push(s);    while(!Q.empty())    {        int u=Q.front();        Q.pop();        inq[u]=false;        //G[u]是图的邻接表储存,其本身是vector        for(int i=0;i<G[u].size();++i)        {            Edge& e=edges[G[u][i]];            if(d[u]<INF&&d[e.to]>d[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;}


1 0
原创粉丝点击