タイトルは最大経路重み側/右側最小エッジの2点Q T S T、地図との所定の最小値を意味します
実際には、最小エッジウェイトと同じ大きさ、できるだけ小さい最大エッジ重みを作ることです
右サイド・バイ・サイドはSまで、彼の側に参加し、Tユニコム、この時点で最小の右側最大、更新された回答よりも小さい降順で、列挙最大エッジ、ソーティング
あまりにもbzoj(shabi)
#include <ビット/ STDC ++ H> の#defineは長い長いllの 使用 名前空間STDを、 const int型 MAXN = 509 ; const int型 MAXM = 5009 ; INTのN、M、S、T。 構造体ノード{ int型U、V、W。 ブール 演算子 <(constのノード&T)のconst { リターン <W TW。 } } E [MAXM]。 int型FA [MAXN]。 INT見つける(INT X){ 一方(X = FA [X]!)X = FA [X] = FA [X] FA]。 リターンのx; } LLのGCD(LLのB、LL){ 戻り Bの== 0:GCD(B、%の?B)。 } 構造体FRAC { 長い 長いアップ、DN。 FRAC(){} FRAC(UU -1,11,11-のDD){ アップ = UU; DN = DD。 } ボイド 集合(){ int型 G = GCD(アップ、DN)。 アップ / = G、DN / = G。 } 無効 アウト(){ // セット()。 もし(DNの== 1)のprintf(" %d個の\ n " 、アップ)。 他のprintf(" %D /%D \ n " 、アップ、DN)。 } ブール 演算子 <(CONST FRAC&T)のconst { 場合(アップ* t.dn <DN * t.up)リターン 1 。 それ以外 の戻り 0 ; } } ANS。 int型VIS [MAXN]。 INT メイン(){ scanf関数(" %d個の%のD "、&N、&M)。 以下のために(int型 i = 1 ; iが<= N; iは++)FA [I] = I。 以下のための(int型 I = 1、U、V、I <= M; iは++ ){ scanf関数(" %D%D%D "、&E [I] .U、&E [I] .V、&E [I] .W)。 U =見つける(E [I] .U)、V = 見つける(E [I] .V)。 もし(!U = V)FA [U] = V; } のscanf(" %D%dの"、&S&T)。 もし(見つける(S)=!見つける(T)){ のprintf(" IMPOSSIBLE " ); リターン 0 ; } int型 FF = 見つける(S)。 以下のために(int型 I = 1 iが++; iが<= n)の場合()は、(iを見つける= FFの!)VIS [I] = 1 ; 以下のために(int型 i = 1 ; iが<= N; iは++)FA [I] = I。 ソート(E + 1、E + 1 + M)。 ANS = FRAC(1E8、1 )。 用(int型 I = 1 ; I <= M Iは++ ){ int型、U = E [I] .U、V = E [I] .V。 もし(VIS [U] || VIS [V])続けます。 用(INT J = 1 ; J <= N; J ++)FA [j]は= jは、 以下のための(int型 J =; j>は=1 ; j-- ){ int型、U = E [J] .U、V = E [J] .V。 もし(VIS [U] || VIS [V])続けます。 int型 UU =(U)を見つけ、VV = (v)を見つけます。 もし(!UU = VV){ FA [UU] = VV。 もし(見つける(S)== 検索(T)){ FRACのA = FRAC(E [I] .W、E [J] .W)。 A。セット()。 もし(<ANS)ANS = 。 破ります; } } } } 年。セット()。 年。アウト(); }