아이디어 : 먼저, 도로 2 차원 어레이 DIS [] []의 입력 처리가 복구되어, 그의 대응 DIS가 [I] [J]가 0으로 설정된다. 그런 다음 마지막
모든 DIS는 [] [] 트리 알고리즘에 걸친 최소 크루스 칼을 사용하여 얻은 측 구조체를 저장한다.
1 #INCLUDE <iostream> 2 #INCLUDE <벡터> 3 #INCLUDE < 문자열 > 4 #INCLUDE <cmath> 5 #INCLUDE < 설정 > 6 #INCLUDE <알고리즘> 7 #INCLUDE <cstdio> 8 #INCLUDE <지도> 9 # 포함 <CString을> 10 11 사용 스페이스 성병; (12) (13) 의 INT DIS [ 110 ] [ 110 ]; 14 구조체 에지 15 { 16 INT의 A, B; 17 INT비용; 18 } 에지 [ 1000010 ]; 19 (20) INT의 트리 [ 110 ]; 21 (22) INT 이제 findroot ( INT X) 23 { 24 일 경우 (트리 [X] == - 1 ) 25 리턴 X; 26 INT TMP = 이제 findroot (트리 [X]); 27 트리 [X]는 = TMP를; 28 리턴 TMP; 29 } 30 31 부울 CMP (에지 E1, E2 에지) 32 { 33 반환 e1.cost <e2.cost; 34 } 35 36 INT의 주 () 37 { 38 INT N; 39 는 scanf ( " %의 D ' , N); (40) 에 대한이 ( 값 int = 1을 1 ; 나는 = <N; ++ I) 41 트리 [I] = - 1 ; (42) (43) 에 대해 ( int로 I = 1 ; i가 N = <++ I) 44 대 ( INT J = 1 ; J <= N; ++ j)는 45 는 scanf (" %의 D " , DIS [I] [J]); 46 (47) INT에서 Q; 48 는 scanf ( " %의 D ' , Q); (49) 에 대한이 ( int로 I = 1 ; I <= Q; ++ I) 50 { 51 INT의 A, B; 52 는 scanf ( " % d 개 %의 D ' , A, 및 B); 53 DIS [A]는 [B] = 0 ; 54 } 55 56 INT에 K = 1 ; 57 대 (INT I = 1. , I는 <= N-, ++는 I) 58 대 ( INT J = 1. , J <= N-; ++ J) (59) { 60 IF ! (J는 = 내가 J를 <&&는) // 주의 동일한 것을 측면을 저장 반복하지 마십시오! 61는 { 62된다 = 에지 [K] II.A I가, 63은 에지 [K] .B = J; 64 엣지 [K] = .cost DIS [I] [J] 65 ++ K; 66 } 67 } 68 정렬 ( + 에지 . 1 , 에지 +K, CMP); 69 INT ANS = 0 ; (70) 에 대한이 ( int로 I = 1 ; i가 K를 <; ++ I) 71 { 72 INT RA = 이제 findroot (에지 [I] .A); (73) INT RB = 이제 findroot (에지 [I] .B); 74 의 경우 (RA =! RB) 75 { 76 트리 [RA] = RB; 77 ANS + = 가장자리 [I] .cost; 78 } 79 } 80 81 의 printf ( " % D \ 없음" , 년) 82 83 복귀 0 , 84 }