zoukankan      html  css  js  c++  java
  • 洛谷P3371 【模板】单源最短路径

    P3371 【模板】单源最短路径

      • 282通过
      • 1.1K提交
    • 题目提供者HansBug
    • 标签
    • 难度普及/提高-

      讨论  题解  

    最新讨论

    • 不萌也是新,老司机求带
    • 求看,spfa跑模板40分
    • 为什么orz了
    • 题目输入格式的描述是错的
    • 题目描述是有问题的
    • 关于题目的疑惑

    题目描述

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

    输入输出格式

    输入格式:

    第一行包含三个整数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 <cstdio>
    #include <cstring>
    #include <queue>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    int n, m, s,tot,head[10010],nextt[500010],to[500010],w[500010],vis[10010],d[10010];
    
    void spfa(int x)
    {
        queue <int> q;
        q.push(x);
        vis[x] = 1;
        d[x] = 0;
        while (!q.empty())
        {
            int u = q.front();
            q.pop();
            vis[u] = 0;
            for (int i = head[u];i; i = nextt[i])
            {
                int v = to[i];
                if (d[u] + w[i] < d[v])
                {
                    d[v] = d[u] + w[i];
                    if (!vis[v])
                    {
                        vis[v] = 1;
                        q.push(v);
                    }
                }
            }
        }
    }
    
    void add(int a,int b,int c)
    {
        tot++;
        to[tot] = b;
        nextt[tot] = head[a];
        head[a] = tot;
        w[tot] = c;
    }
    
    int main()
    {
        scanf("%d%d%d", &n, &m, &s);
        for (int i = 1; i <= m; i++)
        {
            int f, g, w;
            scanf("%d%d%d", &f, &g, &w);
            add(f, g, w);
        }
        for (int i = 1; i <= n; i++)
            d[i] = 2147483647;
        spfa(s);
        for (int i = 1; i <= n; i++)
        {
            if (s != i)
                printf("%d ", d[i]);
            else
                printf("0 ");
        }
        //while (1);
    
        return 0;
    }
  • 相关阅读:
    Repeater使用二
    db2, oracle和sqlserver取前几行的语法
    AspNet 路径问题
    PL/Sql 中创建、调试、调用存储过程
    ORA错误编码
    PL/SQL 设置
    常用命令行
    SQL Server将单表数据导出成insert脚本形式
    获取Url链接内容
    Oracle安装注意事项
  • 原文地址:https://www.cnblogs.com/zbtrs/p/5978777.html
Copyright © 2011-2022 走看看