【洛谷 3371】【模板】单源最短路径(spfa+slf)

来源:互联网 发布:架子鼓app软件下载 编辑:程序博客网 时间:2024/06/18 17:51

问题描述
如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度。
输入
第一行包含三个整数N、M、S,分别表示点的个数、有向边的个数、出发点的编号。
接下来M行每行包含三个整数Fi、Gi、Wi,分别表示第i条有向边的出发点、目标点和长度。
输出
一行,包含N个用空格分隔的整数,其中第i个整数表示从点S出发到点i的最短路径长度(若S=i则最短路径长度为0,若从点S无法到达点i,则最短路径长度为2147483647)
样例输入
4 6 1
1 2 2
2 3 2
2 4 1
1 3 5
3 4 3
1 4 4
样例输出
0 2 4 3
算法讨论
spfa模板。外加一个slf优化,若当前点为j,队头为i,如果d[j]

#include <cstdio>#include <deque>using namespace std;#define maxn 10006#define maxm 500006#define maxlongint 2147483647struct edge{    int f,t,w,n;}a[maxm];deque <int> q;int d[maxn],ls[maxn],n,m,s;bool v[maxn];int init(){    scanf("%d%d%d",&n,&m,&s);    for (int i=1;i<=m;i++)    {        scanf("%d%d%d",&a[i].f,&a[i].t,&a[i].w);        a[i].n=ls[a[i].f];        ls[a[i].f]=i;    }    return 0;}int spfa(){    for (int i=1;i<=n;i++)        d[i]=maxlongint;    d[s]=0; v[s]=1;    q.push_back(s);    while (!q.empty())    {        int u=q.front();        q.pop_front(); v[u]=0;        for (int i=ls[u];i;i=a[i].n)            if (d[u]+a[i].w<d[a[i].t])            {                d[a[i].t]=d[u]+a[i].w;                if (!v[a[i].t])                {                    v[a[i].t]=1;                    if (q.empty() || d[a[i].t]>d[q.front()])                        q.push_back(a[i].t);                    else                        q.push_front(a[i].t);                }            }    }    for (int i=1;i<=n;i++)        printf("%d ",d[i]);    return 0;}int main(){    init();    spfa();    return 0;}

这里写图片描述
Pixiv ID:63134378

原创粉丝点击