您的位置:首页 > 其它

旅行 (Standard IO)

2016-08-12 15:02 351 查看
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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  旅行-Standa