zoukankan      html  css  js  c++  java
  • 洛谷P3371 【模板】单源最短路径(弱化版)(SPFA解法)

    题目背景

    本题测试数据为随机数据,在考试中可能会出现构造数据让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。保证数据随机。

    对于真正 100% 的数据,请移步 P4779。请注意,该题与本题数据范围略有不同。

     SPFA思想: 运用队列,第一次插入原点,以后每次取出队首元素,便利所有与这个元素相接的元素,更新答案,如果相接元素还没有确定最优解,就将此元素入队,重复上述操作,直到队列为空。

    AC代码:

     1 #include<iostream>
     2 #include<queue> 
     3 #include<algorithm>
     4 #include<cstring>
     5 using namespace std;
     6 int n,m,s,first[10001],cnt,dist[10001],pp;
     7 struct kkk{
     8     int len = 0,end = 0,next = 0;//分别代表边权、尾端点、下一条边 
     9 }g[500001];
    10 queue<int > l;
    11 bool b[10001];//b[i]代表第i个元素是否已经确定为最佳答案 
    12 void ad(int q,int w,int e) {//建图 
    13     ++cnt;
    14     g[cnt].end = w;
    15     g[cnt].len = e;
    16     g[cnt].next = first[q];
    17     first[q] = cnt;
    18 }
    19 void spfa(int s){
    20     dist[s] = 0;//初始化原点 
    21     l.push(s);
    22     b[s] = true;
    23     while(!l.empty()) {
    24         int oo = l.front();
    25         l.pop();
    26         b[oo] = false;
    27         for(int i = first[oo]; i != 0;i = g[i].next) {
    28             ++pp;
    29             int end = g[i].end;
    30             int len = g[i].len;
    31             int newd = dist[oo] + len;
    32             if(newd < dist[end]) {//更新答案 
    33                 dist[end] = newd;
    34                 if(!b[end]) {
    35                     l.push(end);
    36                     b[end] = true;
    37                 }
    38             }
    39         }
    40     }
    41 }
    42 int main(){
    43     ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    44     cin >> n >> m >> s;
    45     for(int i = 1;i <= n;i++) {
    46         dist[i] = 2147483647;//将答案设置成无限大 
    47     }
    48     for(int i = 1;i <= m; i++) {
    49         int u,k,e;
    50         cin >> u >> k >> e;
    51         ad(u,k,e);
    52     }
    53     spfa(s);
    54     for(int i = 1;i <= n;i++) 
    55         cout << dist[i] <<" ";
    56     return 0;    
    57 }
  • 相关阅读:
    使用poi读取excel文件 Cannot get a text value from a numeric cell
    异步往数据库中插入每个用户的增删改操作日志
    mybatis where in语句中参数过多
    使用泛型实现对int数组或者String数组进行排序
    读取hdfs目录,并在web页面上展示文件里的内容
    java使用优先级队列实现哈夫曼编码
    使用JavaScript动态的绑定、解绑 a 标签的onclick事件,防止重复点击
    git概念和操作流程
    新的学习路径、学习想法和思路的头脑风暴:基于泰迪云课程,对数据分析和数据建模,机器学习算法进行统筹,接着是基于大数据的数据挖掘、进度、
    RSA加密算法流程,公钥加密,私钥解密
  • 原文地址:https://www.cnblogs.com/lipeiyi520/p/10340370.html
Copyright © 2011-2022 走看看