zoukankan      html  css  js  c++  java
  • 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.



  • 相关阅读:
    HDU 1501 Zipper(DFS)
    HDU 2181 哈密顿绕行世界问题(DFS)
    HDU 1254 推箱子(BFS)
    HDU 1045 Fire Net (DFS)
    HDU 2212 DFS
    HDU 1241Oil Deposits (DFS)
    HDU 1312 Red and Black (DFS)
    HDU 1010 Tempter of the Bone(DFS+奇偶剪枝)
    HDU 1022 Train Problem I(栈)
    HDU 1008 u Calculate e
  • 原文地址:https://www.cnblogs.com/zyx-crying/p/9319626.html
Copyright © 2011-2022 走看看