kurskal 알고리즘 희소 그래프 더 적합
크루스 칼 의사 :
. (1 개) INT 크루스 칼은 () { 2 ; 그래서 에지 가중치 ANS, 양쪽 num_edge의 현재 개수의 최소 스패닝 트리의 합의 최소 스패닝 트리 있음 . (3) 에서 작은 가장자리 중량 사방 대형] . (4) 에 대한 큰 작은은 (모두 열거 측) { . 5 IF 두 단부 통신 블록 점) {의 다른 측면에서 (현재 테스트 6 테스트 최소 스패닝 트리가 첨가된다 . 7 ANS = + 시험의 오른쪽 측면; 8 최소 스패닝 트리의 에지의 현재 개수 Num_Edge 더하기 하나는, 9 사이클이 1 인 현재의 정점 수는 마이너스 측 Num_Edge 단부의 수와 동일하다; 10 } . 11 (12)이다 } (13)는 복귀 ANS; 14 }
특정 구현 :
. (1 개) 구조체 에지 { 2 INT U, V] // 양쪽 엔드 포인트 번호 . 3 INT의 선정] // 에지 중량 4. } E [MAXV] . 5 6. BOOL CMP (에지 A, 에지 B) { 7. 리턴 a.cost < b.cost] . 8 } 9. INT 아버지 [MAXV]; // 이산 집합 배열 (10) (11). @ 이산 세트 조회 함수 12 INT findFather ( INT X) { 13는 INT에서 A = X; 14 그동안 (X =!아버지 [X]) { 15 X = 아버지 [X] (16) } . 17 (18)가 // 로 압축 . 19 그동안 ! (A는 = 아버지 [A]) { 20는 INT Z = ; 21은 A = 아버지 [A] (22)가 아버지 [Z] =의 X; 23이다 } 24 25 복귀 X; 26이다 } 27 28 // 크루스 칼 함수 정점 파라미터 N도 1의 m의 수에 대해, 우측의 최소 스패닝 트리를 반환 에지의 수가 29 의 INT 크루스 칼 ( INT의 N , INT의 m) { 30 INT ANS =0 , num_edge = 0 ; // 에지의 가중치의 총합이 최소가 스패닝의 현재 수는 에지 (31) // 초기화 이산 세트 (32) 에 대해 ( INT I = 1. ; I <= N-; I는 ++ ) { 33은 아버지 [I] = I , 34 } 35 36 // 사방 정렬 37 정렬 (E, E + m, CMP), 38 인 // 모든 통과가 에지 (39) 에 대해 ( INT I = 0 ; I은 m이 <; I는 ++ ) { 40 INT FAU = findFather (E [I]는 .u) // 에지 쿼리 테스트 세트 여기서 두 기단 41 INT FAV = findFather (E [I] .V) 42 IF (FAU =! FAV) { 43은 아버지 [FAV = FAU, 44은 ANS + = , E [I] .cost 45 num_edge ++ ; (46)는 IF (== num_edge N-- 1. ) BREAK ; // 트리가 루프에서 구축 된 경우 (47) } (48) } (49) IF (N- num_edge =! - 1. ) 창 - 1이다. ] // 도 없음이 반환 -1 50 사람의 리턴ANS; // 오른쪽과 나무에 걸쳐 최소 그렇지 않으면 51 }