• P3371 【模板】单源最短路径(弱化版)


    题目背景

    本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779

    题目描述

    如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度。

    输入格式

    第一行包含三个整数N、M、S,分别表示点的个数、有向边的个数、出发点的编号。

    接下来M行每行包含三个整数Fi、Gi、Wi,分别表示第i条有向边的出发点、目标点和长度。

    输出格式

    一行,包含N个用空格分隔的整数,其中第i个整数表示从点S出发到点i的最短路径长度(若S=i则最短路径长度为0,若从点S无法到达点i,则最短路径长度为2147483647)

    输入输出样例

    输入 #1
    4 6 1
    1 2 2
    2 3 2
    2 4 1
    1 3 5
    3 4 3
    1 4 4
    输出 #1
    0 2 4 3

    说明/提示

    时空限制:1000ms,128M

    数据规模:

    对于20%的数据:N<=5,M<=15;

    对于40%的数据:N<=100,M<=10000;

    对于70%的数据:N<=1000,M<=100000;

    对于100%的数据:N<=10000,M<=500000。保证数据随机。

    #include<iostream>
    #include<queue>
    using namespace std;
    const int inf=500005;
    struct node{
        int next,to,dis;
    }edge[inf];
    int vis[inf],head[inf],num=0,dis[inf];
    int n,m,s;
    void addedge(int a,int b,int c)
    {
        edge[++num].next=head[a];
        edge[num].to=b;
        edge[num].dis=c;
        head[a]=num;
    }
    void spfa()
    {
        for(int i=1;i<=n;i++)
        {
        dis[i]=inf;
        vis[i]=0;
        }
        queue<int> q; 
        q.push(s);
        vis[s]=1;
        dis[s]=0;
        while(!q.empty())
        {
            int u=q.front();
            q.pop();
            vis[u]=0;
            for(int i=head[u];i;i=edge[i].next)
            {
                int v=edge[i].to;
                if(dis[v]>dis[u]+edge[i].dis)
                {
                    dis[v]=dis[u]+edge[i].dis;
                    if(vis[v]==0)
                    {
                    vis[v]=1;
                    q.push(v);
                    }
                }
            }
        }
    }
    int main()
    {
        int a,b,c;
        cin>>n>>m>>s;
        for(int i=1;i<=m;i++)
        {
            cin>>a>>b>>c;
            addedge(a,b,c);
        }
        spfa();
        for(int i=1;i<=n;i++)
        if(dis[i]==inf)
        cout<<"2147483647"<<" ";
        else
        cout<<dis[i]<<" ";
        return 0;
     } 

    这就是spfa算法加邻接表

    如果你够坚强够勇敢,你就能驾驭他们
  • 相关阅读:
    面板数据及其基本模型
    markdwon编辑公式入门
    向纳什大神致敬
    我和我的祖国观后感
    少年的你观后感
    特征选择学习笔记1(综述)
    时间序列学习笔记1
    《绿皮书》观后感
    《美丽心灵》观后感
    pycharm跨目录调用文件
  • 原文地址:https://www.cnblogs.com/liuzhaojun/p/11276890.html
Copyright © 2020-2023  润新知