제목은 최소 최대 경로 중량 측 / 최소 오른쪽 가장자리지도 및 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 및 휴식 ; } } } } 년. 설정 (); 년. 아웃 (); }