旅行 (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.
原文地址:https://www.cnblogs.com/zyx-crying/p/9319617.html