[템플릿] 최소 스패닝 트리

 프림 :
이 도면은 연결되지 않은 경우 무향 그래프 주어진 최소 스패닝 트리가 출력 불가능한 얻어진다.

#INCLUDE <비트 / stdc ++ H.>
 사용  스페이스 성병;
CONST  INT의 MAXM = 200,005 ;
CONST  INT INF = 0x3f3f3f3f ;
구조체 에지 {
     INT의 V, W, 다음; 
E} [MAXM << 1 ];
INT의 CNT, N, m, 합, t, P, 지금 = 1 ;
int로 DIS [ 5005 ], 헤드 [MAXM, 힘 [ 5005 ];
int로 A, B, C를; 

보이드 추가 ( INT UU, INT VV, INT WW) 
{ 
    E [++ CNT] .V = VV; 
    E [CNT] .W = WW; 
    E [CNT] 다음 내용 = 헤드 [UU]; 
    헤드 [UU] = CNT; 
} 
INT 의 main () 
{ 
    CIN >> >> N m;
    위한 ( int로 난 = 1 ; I <= m 내가 ++ ) 
    { 
        CIN 사항 >> >> >> B C; 
        추가 (A, B, C); 추가 (먼트를 A, C); 
    } 
    에 대해 ( int로 난 = 1 ; i가 N = <; 내가 ++ ) 
        DIS [I] = INF;
    대한 ( INTI = 헤드 [ 1 ]; 나는; I = E [I]가 다음 내용) 
        DIS [E [I]를 .V] = 분 (E [I] .W, DIS [E [I] .V]);
    동안 (t ++ < N) 
    { 
        힘 [현재] = 1 ;
        INT 미네소타 = INF; 
        지금 = - 1 ;
        위한 ( int로 I = 1 ; i가 <= N; 내가 ++ ) 
        { 
            경우 (힘 [I] 미네소타 &&!> DIS [I]) 
            { 
                미네소타 = DIS [I]; 
                지금 = I; 
            }
        }
        경우 (현재 == - 1 ) 
        { 
            COUT << " 불가 " ;
            반환  0 ; 
        }  + = 미네소타;
        위한 ( int로 I = 헤드 [현재] I, I = E [i]는 다음 내용) 
        { 
            경우 (힘 [E [I] .V] && E [I] .W <! DIS [E [I] .V ]) 
                DIS [E [I]를 .V] = E [I] .W; 
        } 
    } 
    COUT << 합;
    반환  0 ; 
}

 

그것은 무향 그래프를 제공, 최소 스패닝 트리를 얻을 수있다. 통신 여부를 판단하지 마십시오

#INCLUDE <비트 / stdc ++ H.>
 사용  스페이스 성병;
CONST  INT의 MAXM = 200,005 ;
CONST  INT INF = 0x3f3f3f3f ;
구조체 에지 {
     INT의 V, W, 다음; 
E} [MAXM << 1 ];
INT의 CNT, N, m, 합, t, P, 지금 = 1 ;
int로 DIS [ 5005 ], 헤드 [MAXM, 힘 [ 5005 ];
int로 A, B, C를; 

보이드 추가 ( INT UU, INT VV, INT WW) 
{ 
    E [++ CNT] .V = VV; 
    E [CNT] .W = WW; 
    E [CNT] 다음 내용 = 헤드 [UU]; 
    헤드 [UU] = CNT; 
} 
INT 의 main () 
{ 
    CIN >> >> N m;
    위한 ( int로 난 = 1 ; I <= m 내가 ++ ) 
    { 
        CIN 사항 >> >> >> B C; 
        추가 (A, B, C); 추가 (먼트를 A, C); 
    } 
    에 대해 ( int로 난 = 1 ; i가 N = <; 내가 ++ ) 
        DIS [I] = INF;
    대한 ( INTI = 헤드 [ 1 ]; 나는; I = E [I]가 다음 내용) 
        DIS [E [I]를 .V] = 분 (E [I] .W, DIS [E [I] .V]);
    동안 (t ++ < N) 
    { 
        힘 [현재] = 1 ;
        INT 미네소타 = INF;
        위한 ( int로 I = 1 ; i가 <= N; 내가 ++ ) 
        { 
            경우 (힘 [I] 미네소타 &&!> DIS [I]) 
            { 
                미네소타 = DIS [I]; 
                지금 = I; 
            } 
        } 
        경우 [현재] (DIS ==INF) 
        { 
            COUT << " orz " ;
            반환  0 ; 
        }  + = 미네소타;
        위한 ( int로 I = 헤드 [현재] I, I = E [i]는 다음 내용) 
        { 
            경우 (힘 [E [I] .V] && E [I] .W <! DIS [E [I] .V ]) 
                DIS [E [I]를 .V] = E [I] .W; 
        } 
    } 
    COUT << 합;
    반환  0 ; 
}

현재의 방법의 각 루프의 양면 사이의 차이에

 

 

 

 

 

 

추천

출처www.cnblogs.com/lovezxy520/p/11615273.html