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.



  • 相关阅读:
    codeforce 148D. Bag of mice[概率dp]
    poj2096 Collecting Bugs[期望dp]
    poj3744 Scout YYF I[概率dp+矩阵优化]
    hdu 5318 The Goddess Of The Moon
    hdu5411 CRB and Puzzle[矩阵优化dp]
    poj3734 Blocks[矩阵优化dp or 组合数学]
    1948 NOI 嘉年华
    教主泡嫦娥[有趣的dp状态设计]
    HDU 4455 Substrings[多重dp]
    1296: [SCOI2009]粉刷匠[多重dp]
  • 原文地址:https://www.cnblogs.com/zyx-crying/p/9319626.html
Copyright © 2011-2022 走看看