• Travel (Standard IO)


    题意/Description:

           小Q非常喜欢在自己的国家旅行。小Q所在的国家有N座城市,分别编号为1~n,小Q所在的城市编号为1。小Q现在想知道从他所在的城市出发,到其他N-1个城市的最短路程分别是多少?

     

    读入/Input

           第一行两个整数N,M(1<=n<=1000,1<=M<=100000),分别表示小Q所在的国家有N座城市以及城市间有M条单向道路。
          接下来M行,每行三个整数x,y,len(1<=x,y<=n,1<=len<=100000)表示从城市x去到城市y需要走len这么多路程。
           输入可能存在重边

     

    输出/Output

           一共N-1行,每行一个整数,第i个整数表示小Q从城市1到城市(i+1)的最短路程。如果不能到达输出-1

     

    题解/solution

           明显的最短路,SPFA秒掉。注意是单向。

     

    代码/Code

    const
      maxE=100001;
      maxV=400001;
    
    type
      arr=record
        x,y,w,next:int64;
      end;
    
    var
      n,m,nm:longint;
      a:array [0..maxV] of arr;
      ls:array [0..maxE] of longint;
      list,b,d,v:array [0..maxE] of int64;
      ans,max:int64;
    
    procedure spfa;
    var
      i,j,k,h,t:longint;
    begin
      fillchar(d,sizeof(d),63);
      max:=d[1]; h:=0; t:=1;
      v[1]:=1; list[1]:=1; d[1]:=0;
      repeat
        h:=h+1;
        j:=ls[list[h]];
        while j<>0 do
          begin
            with a[j] do
              begin
                if d[x]+w<d[y] then
                  begin
                    d[y]:=d[x]+w;
                    if v[y]=0 then
                      begin
                        t:=t+1;
                        list[t]:=y;
                        v[y]:=1;
                      end;
                  end;
                j:=next;
              end;
          end;
        v[list[h]]:=0;
      until h=t;
    end;
    
    procedure init1;
    begin
      fillchar(ls,sizeof(ls),0);
      fillchar(list,sizeof(list),0);
      fillchar(b,sizeof(b),0);
      fillchar(a,sizeof(a),0);
      fillchar(v,sizeof(v),0);
    end;
    
    procedure init2;
    var
      i,t,k:longint;
    begin
      readln(n,m);
      for i:=1 to m do
        begin
          t:=i*2; k:=t-1;
          with a[k] do
            begin
              readln(x,y,w);
              next:=ls[x];
              ls[x]:=k;
            end;
        end;
      m:=m*2;
    end;
    
    procedure print;
    var
      i:longint;
    begin
      for i:=2 to n do
        writeln(d[i]);
    end;
    
    
    procedure init_main;
    var
      i:longint;
    begin
      init1;
      init2;
      spfa;
      print;
    end;
    
    begin
      init_main;
    end.



  • 相关阅读:
    day33-1 线程队列
    day32-4 GIL全局解释锁
    day32-3 阻塞非阻塞同步异步&异步回调
    day32-2 线程池与进程池
    day32-1 事件Event
    Chrome设置--disable-web-security解决跨域问题
    去除系统部分属性触摸是出现的色值
    初始化一个React项目
    ## normalize.css 中文版
    vue组件的3种书写形式
  • 原文地址:https://www.cnblogs.com/zyx-crying/p/9319626.html
Copyright © 2020-2023  润新知