질문의 의미 :
이제 소위받을 자격이 섬 사이에 다리를 구축하기로 결정, 섬 사이의 거리 미만 10m, 이상, 1,000m가 없습니다. 물론, 돈을 절약하기 위해, 단지 두 도로가 섬으로 이어질 사이에 달성하기 위해이 필요합니다. 어떤 다리 가격이 1백위안 / m이다.
해결 방법 :
최소한의 스패닝 트리 보드
두 섬 사이의 거리를 결정하기 위해 필요할 때 업데이트 ANS 두 섬 사이의 거리를 계산하는 단계 사이 [10,1000]
도 유니콤 즉 최종 합계가 N-1과 동일하다면 동일한 출력 여부 OH!
코드 :
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
사용법 #include <iostream> #INCLUDE <STDIO.H> #INCLUDE <math.h> #INCLUDE <알고리즘> #INCLUDE <벡터> 사용 스페이스 성병; 타입 정의 긴 긴 LL; CONST INT maxn = 10005 ; INT [maxn] F; INT (X) [maxn], Y [maxn]; INT의 N, CNT, m; 구조체 노드 { int로 U를 V; 더블 w; 부울 연산자 <( CONST 노드 a) CONST { 창 w <아; } } 에지 [maxn]; INT (존재 의 INT (X)) { 반환 X == F [X] × : F [X] = 찾기 (F [X]); } 공극 추가 ( int로 U, INT의 V, 더블 w) { 에지 [CNT] .u = U; 에지 [CNT] .V = V; 에지 [CNT . ++] w = w; } 공극 크루스 칼 () { 이중 의 ANS = 0.0 ; INT 합 = 0 ; 대 ( INT I = 0; 난 = <N; ⅰ) ++ F [I] = I; 정렬 (에지, 에지 + CNT); 위한 ( int로 I = 0 ; I <I은 CNT가 ++ ) { INT (X) = 에지 [I] .u; INT Y = 가장자리 [I] .V; INT의 FX = (x)를 찾기; INT 기 = 찾기 (Y); 만약 (! = FX 기 && 에지 [I] .W> = 10 && 에지 [I] .W <= 1,000 ) { F [FX] = 기; 요약 ++ ; ANS + = 가장자리 [I] .W; } 경우 (N- 합 == 1 ) 파괴 ; } 경우 (합계 N- == 1 ) 인 printf ( " % .1f입니다 \ 없음은 " * ans와 100 ); 다른 사람 의 printf ( " 오 \ n! " ); } 이중 get_dis ( int로 I, INT의 J) { 이중 의 DIS =하면 SQRT ((X [I] -x [J]) * (X [I] -x [J]) * 1.0 + (Y [I] -y [ J]) * (Y [I] -y [J]) * 1.0 ); 반환 창피를; } INT 의 main () { INT의 t; 는 scanf ( "%의 D " , t) 동안 (t-- ) { 는 scanf ( " %의 D ' , N), CNT = 0 ; 위해 ( int로 I = 1 ; i가 <= N)는 scanf를 난 ++ ( " % D % D ' , X [I], Y [내가]) 에 대해 ( int로 I = 1 난 = N <; I ++) 대 ( INT J = 나 + 1 , J <= N; J ++ ) { 이중 의 DIS =의 get_dis ( I, J); (I, J, DIS)를 추가; } 크루스 칼 (); } 반환 0 ; }