zoukankan      html  css  js  c++  java
  • 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算法加邻接表

    如果你够坚强够勇敢,你就能驾驭他们
  • 相关阅读:
    Vue播放flv视频流
    js数组处理--对象数组合并相同key的data
    js数组处理--数组排序
    js数组处理--数组去重
    js数组处理--对象数组添加字段
    js数组处理--循环过滤树形数组
    js数组处理--树状数组指定位置增加子节点
    ERP软件基本功能描述
    实施过程好文记录
    2020年九月笔记
  • 原文地址:https://www.cnblogs.com/liuzhaojun/p/11276890.html
Copyright © 2011-2022 走看看