연기 부드러운 교통 프로젝트 - 최소 스패닝 트리

주제 링크

질문의 의미 :

이제 소위받을 자격이 섬 사이에 다리를 구축하기로 결정, 섬 사이의 거리 미만 10m, 이상, 1,000m가 없습니다. 물론, 돈을 절약하기 위해, 단지 두 도로가 섬으로 이어질 사이에 달성하기 위해이 필요합니다. 어떤 다리 가격이 1백위안 / m이다.

해결 방법 :

최소한의 스패닝 트리 보드

두 섬 사이의 거리를 결정하기 위해 필요할 때 업데이트 ANS 두 섬 사이의 거리를 계산하는 단계 사이 [10,1000]

도 유니콤 즉 최종 합계가 N-1과 동일하다면 동일한 출력 여부  OH!

코드 :

사용법 #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 ; 
}
크루스 칼

 

추천

출처www.cnblogs.com/j666/p/11617199.html