zoukankan      html  css  js  c++  java
  • 逃离洞穴(escape)

    题意/Description:

           小Z最近出去旅游,遇上倒霉事了。他和旅游团一起去游洞穴。这里有n个洞穴,编号为1到n。它们之间,有的有双向的小路相连,有的却没有,不过所有洞穴都通过小路连在了一起,没有任何两个洞穴不能相互到达。当游客们分散在各处的时候,忽然出了些故障,所有灯全部熄灭。这时广播响起,要求游客们迅速疏散。
          有两个洞穴是出口,分别编号1和n,每个游客都选择最短的路线,从某一个出口逃离。所有的小路都是有长度的,而所有游客的速度都认为是1。
          现在请问,在给定的T时间内,最多有多少人可以逃离。另一个问题,最慢的游客离开需要多少时间。

     

    读入/Input

           第一行,三个整数,n,m和T,分别表示洞穴的数目,小路的数量和给定的逃离时间。
        接下来m行,每行三个整数x,y和L,表示这条小路连接了编号为x和y的洞穴,而它的长度为L。x和y互不相同,且都在1到n之间。任何两个洞穴之间最多只有一条小路将它们直接相连。
         下一行,一个整数k,表示游客的数量。
         最后一行,k个整数,每个都在1到n之间,表示每个游客所在的洞穴(可能一个洞穴会有多个人)。

     

    输出/Output

           输出两行,每行一个整数。第一行输出T时间内多少人可以逃离,第二行输出最慢的游客逃离洞穴所需要的时间。

     

    题解/solution

           floyd做,最后统计。

     

    代码/Code

    var
      n,m,time,ans,max:longint;
      a:array [0..501,0..501] of longint;
      sum:array [0..501] of longint;
      bo:array [0..501] of boolean;
    procedure init;
    var
      i,x,y,z,k:longint;
    begin
      fillchar(sum,sizeof(sum),0);
      fillchar(a,sizeof(a),$7f div 3);
      readln(n,m,time);
      for i:=1 to m do
        begin
          readln(x,y,z);
          a[x,y]:=z; a[y,x]:=z;
        end;
      fillchar(bo,sizeof(bo),false); 
      readln(k);
      ans:=0; max:=0;
      for i:=1 to k do
        begin
          read(x);
          sum[x]:=sum[x]+1;
          bo[x]:=true;
        end;
    end;
    
    function min(o,p:longint):longint;
    begin
      if o<p then exit(o);
      exit(p);
    end;
    
    procedure main;
    var
      i,j,k:longint;
    begin
      for k:=1 to n do
        for i:=1 to n do
          for j:=1 to n do
            if (k<>i) and (k<>j) and (i<>j) then
              a[i,j]:=min(a[i,j],a[i,k]+a[k,j]);
    end;
    
    procedure print;
    var
      i,t:longint;
    begin
      ans:=sum[1]+sum[n]; max:=0;
      for i:=2 to n-1 do
        if bo[i] then
        begin
          if (a[i,1]<=time) or (a[i,n]<=time) then
            ans:=ans+sum[i];
          t:=min(a[i,1],a[i,n]);
          if t>max then max:=t;
        end;
      writeln(ans);
      write(max);
    end;
    
    begin
      init;
      main;
      print;
    end.



  • 相关阅读:
    HDOJ 2076 夹角有多大(题目已修改,注意读题)
    HDOJ 2058 The sum problem
    HDOJ 2099 整除的尾数
    HDOJ 2075 A|B?
    HDOJ 2071 Max Num
    HDOJ 2056 Rectangles
    HDOJ 2055 An easy problem
    HDOJ 2053 Switch Game
    HDOJ 2052 Picture
    P4139 上帝与集合的正确用法
  • 原文地址:https://www.cnblogs.com/zyx-crying/p/9319627.html
Copyright © 2011-2022 走看看