单源最短路径,spfa

Posted shen-yu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单源最短路径,spfa相关的知识,希望对你有一定的参考价值。

SPFA又是一个好东西,看代码吧qwq

#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <iostream>
using namespace std;

const int oo=2147483647;
const int Maxn=500001;
queue<int> q;

int head[Maxn*2],nxt[Maxn*2],to[Maxn*2],w[Maxn*2];
int n,m,id,a,b,c;
int dist[Maxn];
bool inq[Maxn];
int cnt;

void add(int u,int v,int c)//加边了呢
{
    ++cnt;
    nxt[cnt]=head[u];
    head[u]=cnt;
    to[cnt]=v;
    w[cnt]=c;
}

int main()
{
    memset(inq,false,sizeof(inq));
    cin>>n>>m>>id;
    for(int i=1; i<=m; i++)
        cin>>a>>b>>c,add(a,b,c);
    for(int i=1; i<=n; i++)
        dist[i]=oo;
    dist[id]=0;
    inq[id]=true;
    q.push(id);
    while(!q.empty()) {
        int u=q.front();
        q.pop();
        inq[u]=false;
        for(int v=head[u]; v; v=nxt[v]) {
            if(dist[to[v]]>dist[u]+w[v]) { //神奇的松弛操作了呢
                dist[to[v]]=dist[u]+w[v];
                if(inq[to[v]]==false) {
                    inq[to[v]]=true;
                    q.push(to[v]);
                }
            }
        }
    }
    for(int i=1; i<=n; i++) //没了,挺简单的
        cout<<dist[i]<< ;
    cout<<endl;
    return 0;
}

可以用双端队列deque奥,不用了,懒得改了呢,qwq

以上是关于单源最短路径,spfa的主要内容,如果未能解决你的问题,请参考以下文章

单源最短路径:SPFA 算法

探秘SPFA——强大的单源最短路径算法

SPFA板子 (背景:Luogu P3371 单源最短路径)

luogu P3371 单源最短路径 模板 SPFA

20171109Luogu P3371 模板单源最短路径--SPFA

[模板]洛谷T3371 单源最短路径 SPFA+手工队列类