zoukankan      html  css  js  c++  java
  • 图论-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;
    }
  • 相关阅读:
    去重
    JavaScript 数组
    变量
    2017.3.19 for
    2017.3.19 if,for
    2017.3.14
    2017.3.10
    2017.3.9
    2017.3.7-1
    2017.3.7
  • 原文地址:https://www.cnblogs.com/zuimeiyujianni/p/8847458.html
Copyright © 2011-2022 走看看