[6] 템플릿 최소 스패닝 트리 (크루스 칼)

 

 

 

 

 

 

사용법 #include <iostream> 
#INCLUDE <cstdio> 
#INCLUDE < 문자열 .H> 
#INCLUDE <알고리즘>
 사용  스페이스 성병;
구조체 P 
{ 
    INT (X);
    int로 Y를;
    INT의 t; 
} zyf [ 200001 ];
부울 CMP (p xx에, P의 YY)이 
{ 
    반환 xx.t < yy.t; 
} 
INT 총 = 0 , 합계 = 0 ;
INT FA [ 5001 ], Z, N, m, A, B, K;
INT getfather ( INT w) 
{
    경우 (FA == [w] w)
     ; w 
    FA [w] = getfather (FA [w]);
    반환 FA를 [w]; 
} 
무효화 (함께 int로 U, INT O) 
{ 
    FA [getfather (U)] = getfather (O); 
} 
INT 의 main () 
{ 
    // freopen을 ( "testdata로 (23) .IN", "R", 표준 입력); 
    CIN >> >> N m;
    위한 ( int로 난 = 1 ; i가 N = <; 내가 ++ ) 
    { 
        FA [I] = I; 
    } 
    에 대해 ( int로 난을 =1 ; I <= m; 내가 ++ ) 
    { 
        CIN >> zyf [I] .x를 zyf >> [I] .Y >> zyf [I] .T; 
    } 
    정렬 (zyf + 1 , zyf + m + 1 , CMP); 
    위한 ( int로 난 = 1 ; i가 <= m 내가 ++ ) 
    { 
        경우 (! getfather (zyf [내가] .x를) = getfather (zyf [I]를 .Y)) 
        { 
            함께 (zyf [I] .x와, zyf의 [를 I] .Y); 
            합계 + = zyf [I] .T;
             ( INT의 J = 1 ; J <= N; J ++ ) 
            { 
                INT의 CC =getfather (j);
                경우 (공통의 == J) 
                전체 ++ ; 
            } 
            경우 (총 == 1 )
             파괴 ;  = 0 ; 
        } 
    } 
    경우 (총 == 1 ) 
    COUT << 합;
    
    { 
        COUT << " orz " ; 
    } 
    반환  0 ; 
}

                        여름의 14 일에 의해 2019년 9월 9일

추천

출처www.cnblogs.com/north-star/p/11489423.html