[説明] luogu_P2502 [HAOI2006]旅行(最小スパニングツリー/互いに素なセットファック

タイトルは最大経路重み側/右側最小エッジの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 = 破ります; 
                } 
            } 
        } 
    } 
    年。セット()。
    年。アウト(); 
}

 

おすすめ

転載: www.cnblogs.com/superminivan/p/11571533.html