[설명] luogu_P2502 [HAOI2006] 여행 (최소 스패닝 트리 / 해체-설정 잤어요

제목은 최소 최대 경로 중량 측 / 최소 오른쪽 가장자리지도 및 s, t, 두 지점 Q에서의 t에 부여 수단

실제로, 최소 에지 웨이트 큰로서, 가능한 한 작게 최대 에지 중량을하는

오른쪽 나란히이들 때까지 그의 옆에 가입하고 t 유니콤,이 때 작은 오른쪽 최대 업데이트 답변보다 작은 내림차순으로 열거 가장 큰 가장자리 정렬

너무 bzoj (shabi)

#INCLUDE <. 비트 / stdc ++ H>
 #DEFINE가 긴 긴 것이다
 사용  스페이스 성병;
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) {
     동안 (FA X = [X]!) FA X = [X] = FA [FA [X];
    반환 X를; 
} 
LL의 GCD (LL의 B, A LL) { 
    복귀 ㄴ == 0 A : GCD (B, A %의? b); 
} 
구조체 는 frac {
      길이 까지, DN; 
    FRAC () {} 
    FRAC (LL UU, LL의 DD) {  DN = = UU DD; 
    } 
    무효  세트 () {
         INT g = GCD (최대 DN);  / g =, DN / = g; 
    } 
    무효화  아웃 ) {(
 //         ) (세트; 
        경우 (DN의 == 1 ()의 printf " % D \ 없음 " 최대);
        사람 의 printf ( " % D / D % \ n " , 촬영, DN); 
    } 
    부울  연산자 <( CONST FRAC 및 t) CONST {
         경우 (최대 * t.dn <DN * t.up)  1 ;
        다른  반환  0 ; 
    } 
} ANS; 
INT 힘 [maxn];
INT 의 main () { 
    는 scanf ( " %의 D % d에 " , N, m);
    위한 ( int로 I = 1 ; i가 <= N; 내가 ++) FA [I] = I;
     ( INT I = 1, U는 V, I는 <= m; 내가 ++ ) { 
        는 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);
    경우 (발견 (들)! = 찾기 (t)) { 
        printf와 ( " 이 안되고 " );
        반환  0 ; 
    } 
    INT FF = 찾기 (S);
    위한 ( int로 I = 1 난 ++; 나는 <= N) 경우() (= I를 찾을의 FF를!) 힘을 [I] = 1 ;
    위한 ( int로 I = 1 ; i가 <= N; 내가 ++) FA [I] = I; 
    정렬 (E + 1 , E + 1 + m); 
    ANS = FRAC (1E8, 1 );
    위한 ( int로 I = 1 ; I <= m 내가 ++ ) {
         INT U = E [I] .u, V = E가 [I] .V;
        경우 (힘 [U] || 힘 [V]) 계속 ;
        위한 ( INT의 J = 1 ; J <=는 N; J ++) FA [J]를 = J 단계;
         ( INT의 J = I, J> =1 ; j-- ) {
             INT U = E [J] .u, V = E [J] .V;
            경우 (힘 [U] || 힘 [V]) 계속 ;
            INT UU = (U)을 찾은 VV = (V)를 발견;
            경우 (UU! = VV) { 
                FA [UU] =의 절;
                경우 (찾기 (S) == 찾기 (t)) { 
                    FRAC A를 = FRAC (E [I] .W, E [J] .W); 
                    에이. 설정 ();
                    경우 (a <ANS) ANS = a 및
                    휴식 ; 
                }  
            }
        } 
    } 
    년. 설정 (); 
    년. 아웃 (); 
}

 

추천

출처www.cnblogs.com/superminivan/p/11571533.html