# Luogu P2502 travel SSL_1226 (concurrent search)

;

Title Description

Z town is a beautiful place, attracting tourists from all over the world to visit. There are N scenic spots (No. 1, 2, 3,...) near Z town , N), these scenic spots are connected by M roads, all roads are two-way, and there may be multiple roads between the two scenic spots. Perhaps in order to protect the tourism resources of the place, town Z has a strange rule that for a given road Ri, any vehicle speed on the road must be Vi. The speed change is so fast that the tourists are uncomfortable. Therefore, when they go from one scenic spot to another, they all want to choose the route with the maximum speed and the minimum speed ratio as small as possible, that is, the so-called most comfortable route.

I / O format

Input format:
The first line contains two positive integers, N and M.

The next M lines contain three positive integers: x, y, and V. Indicates that there is a two-way road between attraction x and attraction y, on which vehicles must travel at speed v.

The last line contains two positive integers s, t, indicating the path from scenic spot s to scenic spot T with the minimum speed ratio. S and t may not be the same.

Output format:
If there is no path from scenic spot s to scenic spot t, output "IMPOSSIBLE". Otherwise, a number is output, indicating the minimum speed ratio. If necessary, output a reduced score.

Example of input and output

Input example ා 1:
4 2
1 2 1
3 4 2
1 4
Output example:
IMPOSSIBLE
Enter sample 2:
3 3
1 2 10
1 2 5
2 3 8
1 3
Output sample 2:
5/4
Input sample 3:
3 2
1 2 2
2 3 4
1 3
Output sample 3:
2
explain

[data range]

1

```var
x,y,v:array [0..5001] of longint;
f:array [0..501] of longint;
s,t,p,q,min,max,i,j,n,m:longint;

procedure qsort(l,r:longint);
var
i,j,mid,t:longint;
begin
if l>=r then exit;
i:=l; j:=r;
mid:=v[(l+r) div 2];
repeat
while v[i]<mid do inc(i);
while v[j]>mid do dec(j);
if i<=j then
begin
x[0]:=x[i];x[i]:=x[j];x[j]:=x[0];
y[0]:=y[i];y[i]:=y[j];y[j]:=y[0];
v[0]:=v[i];v[i]:=v[j];v[j]:=v[0];
inc(i); dec(j);
end;
until i>j;
qsort(i,r);
qsort(l,j);
end;

function find(a:longint):longint;
begin
if f[a]=a then exit(a);
f[a]:=find(f[a]);
exit(f[a]);
end;

function gys(ab,xy:longint):longint;
begin
if xy=0 then exit(ab)
else gys:=gys(xy,ab mod xy);
end;

begin
for i:=1 to m do readln(x[i],y[i],v[i]);
qsort(1,m);
min:=1; max:=50000;
for i:=1 to m do
begin
for j:=1 to n do f[j]:=j;
j:=i-1;
p:=v[i];
while (j<=m) and (find(s)<>find(t)) do
begin
inc(j);
f[find(x[j])]:=f[find(y[j])];
q:=v[j];
end;
if find(s)<>find(t) then break;
if q/p<max/min then
begin
min:=p;
max:=q;
end;
end;
if max=50000
then writeln('IMPOSSIBLE')
else begin
p:=gys(max,min);
if max mod min=0 then writeln(max div min)
else writeln(max div p,'/',min div p);
end;
end.```

Posted by cvjacques on Tue, 19 May 2020 08:11:24 -0700