spfa【最短路】【模板】

1.jsk精辟解析

spfa

spfa-负环

2.记录最优路径

int prv[N], pree[N];
int dis[N];
bool in[N];
inline void Init()
{
    memset(dis, 0x3f, sizeof(dis));
    memset(in, false, sizeof(in));

}
void SpfaFirst()
{
    Init();
    memset(prv, -1, sizeof(prv));
    queue<int> q;
    q.push(1);
    dis[1] = 0;
    in[1] = true;

    int u;
    while(!q.empty())
    {
        u = q.front();
        q.pop();
        in[u] = false;
        for(int i = p[u]; ~i; i = e[i].next)
        {
            int v = e[i].v, w = e[i].w;
            if(dis[u]+w < dis[v])
            {
                //cout << dis[v] << " dw: "<<dw<<endl;
                dis[v] = dis[u]+w;
                prv[v] = u;
                pree[v] = i;
                if(!in[v])
                {
                    q.push(v);
                    in[v] = true;
                }
            }
        }
    }
}

3.普通spfa

int dis[N];
bool in[N];
inline void Init()
{
    memset(dis, 0x3f, sizeof(dis));
    memset(in, false, sizeof(in));

}
void Spfa()
{
    Init();
    queue<int> q;
    q.push(1);
    dis[1] = 0;
    in[1] = true;

    int u;
    while(!q.empty())
    {
        u = q.front();
        q.pop();
        in[u] = false;
        for(int i = p[u]; ~i; i = e[i].next)
        {
            int v = e[i].v, w = e[i].w;
            if(dis[u]+w < dis[v])
            {
                //cout << dis[v] << " dw: "<<dw<<endl;
                dis[v] = dis[u]+w;
                if(!in[v])
                {
                    q.push(v);
                    in[v] = true;
                }
            }
        }
    }
}
原文地址:https://www.cnblogs.com/bear-xin/p/14949708.html