zoukankan      html  css  js  c++  java
  • 单源最短路径spfa模板(pascal)洛谷P3371

    题目描述

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

    输入输出格式

    输入格式:

    第一行包含三个整数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

    样例说明:

    明天要市赛了,复习一些模板。

     1 program rrr(input,output);
     2 const
     3   inf=123456789;
     4 type
     5   etype=record
     6      t,w,next:longint;
     7   end;
     8 var
     9   e:array[0..500050]of etype;
    10   a,q,dis:array[0..10010]of longint;
    11   inq:array[0..10010]of boolean;
    12   n,m,s,i,h,t,u,v,w,cnt:longint;
    13 procedure add(u,v,w:longint);
    14 begin
    15    inc(cnt);e[cnt].t:=v;e[cnt].w:=w;e[cnt].next:=a[u];a[u]:=cnt;
    16 end;
    17 begin
    18    assign(input,'r.in');assign(output,'r.out');reset(input);rewrite(output);
    19    readln(n,m,s);
    20    fillchar(a,sizeof(a),0);
    21    for i:=1 to m do begin read(u,v,w);add(u,v,w); end;
    22    fillchar(inq,sizeof(inq),false);
    23    for i:=1 to n do dis[i]:=inf;
    24    h:=0;t:=1;q[1]:=s;dis[s]:=0;inq[s]:=true;
    25    while h<>t do
    26       begin
    27          inc(h);if h>10000 then h:=1;
    28          i:=a[q[h]];
    29          while i<>0 do
    30             begin
    31                if dis[q[h]]+e[i].w<dis[e[i].t] then
    32                   begin
    33                      dis[e[i].t]:=dis[q[h]]+e[i].w;
    34                      if not inq[e[i].t] then
    35                         begin
    36                            inq[e[i].t]:=true;
    37                            inc(t);if t>10000 then t:=1;q[t]:=e[i].t;
    38                         end;
    39                   end;
    40                i:=e[i].next;
    41             end;
    42          inq[q[h]]:=false;
    43       end;
    44    for i:=1 to n do if dis[i]=inf then write(maxlongint,' ') else write(dis[i],' ');
    45    close(input);close(output);
    46 end.
  • 相关阅读:
    php5调用web service
    经典SQL语句大全
    15个初学者必看的基础SQL查询语句
    MySQL数据库INSERT、UPDATE、DELETE以及REPLACE语句的用法详解
    mysql update操作
    Oracle CASE WHEN 用法介绍
    日期时间格式正则表达式
    JS的事件监听机制
    JS 事件介绍
    c#格式化数字
  • 原文地址:https://www.cnblogs.com/Currier/p/6568978.html
Copyright © 2011-2022 走看看