codevs 舒適的路線 1001

題目描述 Description
        Z小鎮是一個景色宜人的地方,吸引來自各地的觀光客來此旅遊觀光。Z小鎮附近共有N(1<N≤500)個景點(編號爲1,2,3,…,N),這些景點被M(0<M≤5000)條道路連接着,所有道路都是雙向的,兩個景點之間可能有多條道路。也許是爲了保護該地的旅遊資源,Z小鎮有個奇怪的規定,就是對於一條給定的公路Ri,任何在該公路上行駛的車輛速度必須爲Vi。頻繁的改變速度使得遊客們很不舒服,因此大家從一個景點前往另一個景點的時候,都希望選擇行使過程中最大速度和最小速度的比儘可能小的路線,也就是所謂最舒適的路線。

輸入描述 Input Description
第一行包含兩個正整數,N和M。接下來的M行每行包含三個正整數:x,y和v(1≤x,y≤N,0 最後一行包含兩個正整數s,t,表示想知道從景點s到景點t最大最小速度比最小的路徑。s和t不可能相同。

輸出描述 Output Description
如果景點s到景點t沒有路徑,輸出“IMPOSSIBLE”。否則輸出一個數,表示最小的速度比。如果需要,輸出一個既約分數。

樣例輸入 Sample Input
樣例1
4 2
1 2 1
3 4 2
1 4

樣例2

3 3
1 2 10
1 2 5
2 3 8
1 3

樣例3
3 2
1 2 2
2 3 4
1 3

樣例輸出 Sample Output
樣例1
IMPOSSIBLE

樣例2
5/4

樣例3

2


代碼:

    var
  flag,s1,t1,s,t,n,m,i,j:longint;
  f,v,x,y:array[0..50000]of longint;


function gcd(x,y:longint):longint;
begin
  if x mod y=0 then exit(y);
  gcd:=gcd(y,x mod y);
end;


procedure qsort(l,r:longint);
var
  i,j,t:longint;
begin
  i:=l;j:=r;t:=v[random(l+r-1)];
  repeat
    while v[i]>t do inc(i);
    while v[j]<t 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;
  if l<j then qsort(l,j);
  if i<r then qsort(i,r);
end;


function father(x:longint):longint;
begin
  if f[x]=x then exit(x);
  f[x]:=father(f[x]);
  exit(f[x]);
end;


procedure main(xx:longint);
var
  i,j,k:longint;
begin
  for i:=1 to n do
    f[i]:=i;
  for i:=xx to m do
    begin
      f[father(x[i])]:=father(y[i]);
      if father(s)=father(t)
        then begin
               inc(flag);
               if flag=1 then begin
                                s1:=v[xx];
                                t1:=v[i];
                              end;
               if (v[xx]/v[i])<(s1/t1)
                 then begin
                        t1:=v[i];
                        s1:=v[xx];
                      end;
             end;
    end;
end;


begin
  readln(n,m);
  for i:=1 to m do
    readln(x[i],y[i],v[i]);
  qsort(1,m);
  readln(s,t);
  for i:=1 to m do
    main(i);
  if flag=0 then writeln('IMPOSSIBLE')
    else if s1 mod t1=0 then writeln(s1 div t1)
           else writeln(s1 div gcd(s1,t1),'/',t1 div gcd(s1,t1));
end.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章