zoukankan      html  css  js  c++  java
  • Party (Standard IO)

    题意/Description:

            N头牛要去参加一场在编号为x(1<=x<=n)的牛的农场举行的派对(1<=N<=1000),有M(1<=m<=100000)条有向道路,每条路长ti(1<=ti<=100);

      每头牛都必须参加完派对后回到家,每头牛都会选择最短路径,求这n个牛的最短路径(一个来回)中最长的一条的长度。特别提醒:可能有权值不同的重边。

     

    读入/Input

            第1行: N,M,X;

      第2~m+1行: Ai,Bi,Ti,表示有一条从Ai到Bi的路,长度为Ti.


    输出/Output

            最长最短路的长度。

    题解/solution

            正和反各做一遍SPFA,用一个数组累加,找最大值。

     

    代码/Code

    const
      maxE=20001;
      maxV=200001;
    type
      arr=record
        x,y,w:longint;
        next:longint;
      end;
    
    var
      nm,n,m,xy,max:longint;
      tu:array [0..maxV] of arr;
      ls,v,d,f,ans:array [0..maxE] of longint;
    
    procedure add(o,p,op:longint);
    begin
      inc(nm);
      with tu[nm] do
        begin
          x:=o; y:=p; w:=op;
          next:=ls[o];
          ls[o]:=nm;
        end;
    end;
    
    procedure spfa;
    var
      he,ta,i,j:longint;
    begin
      he:=0; ta:=1;
      v[xy]:=1; d[1]:=xy; f[xy]:=0;
      repeat
        inc(he);
        j:=d[he];
        i:=ls[j];
        while i<>0 do
          with tu[i] do
            begin
              if f[x]+w<f[y] then
                begin
                  f[y]:=f[x]+w;
                  if v[y]=0 then
                    begin
                      inc(ta);
                      v[y]:=1;
                      d[ta]:=y;
                    end;
                end;
              i:=next;
            end;
        v[j]:=0;
      until he=ta;
    end;
    
    procedure init1;
    var
      i,xx,yy,zz:longint;
    begin
      readln(n,m,xy);
      for i:=1 to m do
        begin
          readln(xx,yy,zz);
          add(xx,yy,zz);
        end;
      fillchar(v,sizeof(v),0);
      fillchar(d,sizeof(d),0);
      fillchar(f,sizeof(f),$7f div 3);
      spfa;
    end;
    
    procedure init2;
    var
      i,t:longint;
    begin
      fillchar(ls,sizeof(ls),0);
      for i:=1 to nm do
        with tu[i] do
          begin
            t:=x; x:=y; y:=t;
            next:=ls[x];
            ls[x]:=i;
          end;
      fillchar(v,sizeof(v),0);
      fillchar(d,sizeof(d),0);
      fillchar(f,sizeof(f),$7f div 3);
    end;
    
    procedure main;
    var
      i:longint;
    begin
      max:=0;
      for i:=1 to n do
        ans[i]:=f[i];
      init2;
      spfa;
      for i:=1 to n do
        if max<ans[i]+f[i] then max:=ans[i]+f[i];
      write(max);
    end;
    
    begin
      init1;
      main;
    end.



  • 相关阅读:
    20180925-5 代码规范,结对要求
    20180925-6 四则运算试题生成
    20180925-7 规格说明书-吉林市2日游
    第二周例行报告
    第二周博客作业
    【杨老师粉丝群】第一周立会报告第四次
    20180925-1 每周例行报告
    规格说明书——吉林市两日游
    效能分析
    四则运算试题生成
  • 原文地址:https://www.cnblogs.com/zyx-crying/p/9319668.html
Copyright © 2011-2022 走看看