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

    Description

      Z 小镇是一个景色宜人的地方,吸引来自各地的观光客来此旅游观光。Z 小镇附近共有N 个景点(编号为1,2,3,…,N),这些景点被M 条道路连接着,所有道路都是双向的,两个景点之间可能有多条道路。也许是为了保护该地的旅游资源,Z 小镇有个奇怪的规定,就是对于一条给定的公路Ri,任何在该公路上行驶的车辆速度必须为Vi。
      速度变化太快使得游客们很不舒服,因此从一个景点前往另一个景点的时候,大家都希望选择行使过程中最大速度和最小速度的比尽可能小的路线,也就是所谓最舒适的路线。

    Input

      第一行包含两个正整数,N 和M。
      接下来的M 行每行包含三个正整数:x,y 和v。表示景点x 到景点y 之间有一条双向公路,车辆必须以速度v 在该公路上行驶。
    最后一行包含两个正整数s,t,表示想知道从景点s 到景点t 最大最小速度比最小的路径。s 和t 不可能相同。

    Output

      如果景点s 到景点t 没有路径,输出“IMPOSSIBLE”。否则输出一个数,表示最小的速度比。如果需要,输出一个既约分数。

    题解

    由于改画风了,本猪有点不习惯啊。为了广大群众着想,就改吧。不过有条件,这次题解就日后补充。

    代码

    var
      n,m,q,z,xt,yt,boo:longint;
      fa:array[0..5001]of longint;
      x,y,w:array[0..5001]of longint;
    procedure qsort(l,r:longint);
    var
      i,j,t,m:longint;
    begin
      i:=l; j:=r;
      m:=w[random(r-l)+l];
      repeat
        while w[i]>m do inc(i);
        while w[j]<m do dec(j);
        if i<=j then
          begin
            t:=x[i]; x[i]:=x[j]; x[j]:=t;
            t:=y[i]; y[i]:=y[j]; y[j]:=t;
            t:=w[i]; w[i]:=w[j]; w[j]:=t;
            inc(i); dec(j);
          end;
      until i>j;
      if i<r then qsort(i,r);
      if j>l then qsort(l,j);
    end;
    
    function find(x:longint):longint;
    begin
      if fa[x]=x then exit(x);
      fa[x]:=find(fa[x]);
      exit(fa[x]);
    end;
    
    procedure trymain(tk:longint);
    var
      i:longint;
    begin
      for i:=1 to n do
        fa[i]:=i;
      for i:=tk to m do
        begin
          fa[find(x[i])]:=find(y[i]);
          if find(q)=find(z) then
          begin
            inc(boo);
            if boo=1 then
              begin
                xt:=w[tk]; yt:=w[i];
              end;
            if (w[tk]/w[i])<(xt/yt) then
              begin
                xt:=w[tk]; yt:=w[i];
              end;
          end;
        end;
    end;
    
    function gcd(o,p:longint):longint;
    begin
      if p=0 then exit(o);
      exit(gcd(p,o mod p));
    end;
    
    procedure print;
    var
      o:longint;
    begin
      if (xt mod yt)=0 then
      begin
        write(xt div yt);
        exit;
      end;
      o:=gcd(xt,yt);
      write(xt div o,'/',yt div o);
    end;
    
    procedure main;
    var
      i:longint;
    begin
      for i:=1 to m do
        trymain(i);
      if boo=0 then write('IMPOSSIBLE')
               else print;
    end;
    
    procedure init;
    var
      i:longint;
    begin
      readln(n,m);
      for i:=1 to m do
        readln(x[i],y[i],w[i]);
      readln(q,z);
    end;
    
    begin
      randomize;
      init;
      qsort(1,m);
      main;
    end.
  • 相关阅读:
    数据结构--树链剖分准备之LCA
    FancyBox的使用技巧 (汇总)
    轮播效果汇总
    媒体查询
    网页效果总结
    sublime使用技巧总结
    js面向对象
    【STL】牛客练习赛16 F-选值 (手写二分应该也能过)
    【数论】【HDU 2048】神、上帝以及老天爷 【错排公式】
    【STL】【HDU2024】C语言合法标识符【水题】
  • 原文地址:https://www.cnblogs.com/zyx-crying/p/9319617.html
Copyright © 2011-2022 走看看