이 N 1에서 번호가 N 마을은, 그리고 당신은 매 2 개 마을이 서로에 연결할 수 있는지 일부 도로는 구축해야한다. 우리는 A와 B 사이에 도로가, 또는 연결되어 A와 C, 그리고 C와 B 사이의 도로가되도록 마을 C가 존재하는 경우에만 경우이 개 마을 A와 B가 연결되어 말한다.
우리는 어떤 마을 사이에 도로가 이미 있다는 것을 알고 작업은 일부 도로가 모든 마을이 연결되어있는 빌드 및 내장 모든 도로의 길이가 최소이다.
우리는 어떤 마을 사이에 도로가 이미 있다는 것을 알고 작업은 일부 도로가 모든 마을이 연결되어있는 빌드 및 내장 모든 도로의 길이가 최소이다.
입력
첫 번째 라인은 정수 N (3 <= N <= 100), 마을의 수이다. 이어서 N 라인 올의 제 i가 N의 정수를 포함하며,이 N의 정수 j 번째의 거리 마 I 및 마 J 사이 (거리가 [1, 1000] 내 정수이어야한다).
이어서 정수 Q (0 <= Q <= N * (N + 1) / 2)가있다. 이어서 Q 라인 와서 각 라인은 두 개의 정수를 포함 내장 된 마 A와 B 사이의 마을 도로 수단 (<= N B 1 <= A <) a 및 b.
이어서 정수 Q (0 <= Q <= N * (N + 1) / 2)가있다. 이어서 Q 라인 와서 각 라인은 두 개의 정수를 포함 내장 된 마 A와 B 사이의 마을 도로 수단 (<= N B 1 <= A <) a 및 b.
산출
당신은 출력 라인은 모든 도로의 길이는 모든 마을이 연결되도록 구축 할 수있는 정수를 포함해야하며,이 값은 최소이다.
샘플 입력
3 0 990 692 990 0 179 692 179 0 1 1 2
샘플 출력
179
문제의 의미가 더 이상 100 개 마을, 다수의 제 1 입력 라인이없는 N 마을의 개수를 나타내고, 거리 N 선을 i 번째 다른 마을 사이의 각각의 마을가 다음 행 번호 m이있다 이 도로의 수는 내장 된 나타내고, 다음 m 행 아래, 각 행은 두 마을 사이에 두 개의 숫자가 좋은 도로를 건설되었다 나타냅니다.
또한 적어도 모든 마을에서 도로 공사는 전제를 함께 연결 할 수있는 기간을 부탁드립니다.
아이디어 : 보일 수 있습니다 질문의 의미를 변형하기가 좋은 도로는 더 이상이 개 마을을 연결할 수 없습니다 마을 사이에 지어, 우리는 마을의 나머지 부분은 최소한의 생성 알고리즘과 연결되지 않은 요구되고있다.
먼저, 그 다음, 저장 및 이차원 어레이 마을 사이의 거리는 마을 표시된 후 마 컨테이너 전달로 2 차원 배열이 데이터를 입력하지 않은 합병 연결되었다 사이 좋은 길을 마지막으로, 크루스 칼 알고리즘 동작을 수행한다.
코드 :
1 #INCLUDE <cstdio> 2 #INCLUDE <fstream> 3 #INCLUDE <알고리즘> 4 #INCLUDE <cmath> 5 #INCLUDE <양단> 6 #INCLUDE <벡터> 7 #INCLUDE <큐> 8 #INCLUDE < 문자열 > 9 # 포함 <CString을> 10 #INCLUDE <지도> 11 #INCLUDE <적층> 12 #INCLUDE < 설정 > 13 #INCLUDE <sstream> 14 #INCLUDE <iostream> 15 #DEFINE 개조 998,244,353 16 #DEFINE EPS를 1E-6 . 17 #DEFINE LL 긴 롱 18은 #DEFINE INF의 0x3f3f3f3f는 19. 은 USING 공간 STD, 20는 21이다 // U 시작점을 나타내고, V는 종점을 나타내고, 코스트 비용이 나타내는 22이다 구조체 노드 (23)가 { 24 INT U, V, 25 번 비용; 26이다 }; 27 //는 오름차순 정렬 28 BOOL CMP (노드 A, 노드 B) (29) { 30 반환 a.cost는 < ; b.cost는 31이다 } 32 // 정보가 저장된 에지 (33)는 벡터 <노드>VE, 34은 35 // FA가 전류 (I)가 가장 먼 조상 나타내는 36 INT FA [ 110 ] 37 // FA를 초기화 그들의 선조 시작 38 인 무효 초기화 ( INT qwq) 39 { 40 대 ( INT I = 0 ; I는 = qwq <; I는 ++ ) (41)가 { 42 인 FA [I] = I; 43이다 } 44이다 } 45 //하는 동시에 경로 압축 먼 조상 발견 46는 INT 찾기 ( INT X) 47 { 48 IF(FA [X] == X) 49 { 50 리턴 X; 51이다 } (52)는 복귀 FA [X]을 = (FA [X]를) 찾기 53이다 } 54 인 // 여부 같은 먼 조상 결정 55 BOOL 체 ( INT에서 , X를 INT Y) (56)가된다 { (57)는 복귀 찾기 (X) == ; 찾기 (Y) (58) } (59) // 결합 된 X, Y, 동일한 가족에 넣어 60 보이드 메르 ( INT의 X을 int로 Y) (61)가 { 62 IF (!체 (X, Y)) (63)가 { 64 FA [FA [X] = FA [Y] 65 } 66 창 ; 67 } 68 INT N-, m, 69 // mA 마을 사이의 거리를 유지하는 70 지능 mA [ 105 ] [ 105 ] (71)가 // BJ 플래그 마을의 번호에 접속 된 72 INT BJ [ 105 ] [ 105 ] (73)는 INT ) (주 74 { 75 는 scanf ( " %의 D " , 및 N-) 76 // 初始化 77 INIT (N); (78) 에 대한이 ( int로 I = 1 난 ++; i가 N = < ) 79 { 80 대 ( INT의 J = 1 ; J <= N; J ++ ) 81 { 82 는 scanf ( " %의 D ' , m); 83 최대 10mA I] [J] = m; 84 } 85 } 86 INT의 A, B; 87 // 初始化BJ 88 memset 함수를 (BJ, 0 , sizeof 연산자(BJ)); 89 는 scanf ( " %의 D ' , m); (90) 에 대한이 ( int로 I = 0 ; I <m은, 내가 ++ ) 91 { 92 는 scanf ( " % d 개 %의 D ' , A, 및 B); 93 // 标记, 94 개 BJ [A] [B] = 1 ; 95 개 [A] = [B] BJ 1 ; 96 } 97 노드에는,하지 (98) 에 대한이 ( int로 I = 2 ; i가 N = <; 내가 ++ ) 99 { 100 대 ( INT J = 1. , J <I, J ++ ) 101 { 102 // 마을 사이도 존재하지 않는 경우 (103)는 IF (BJ [I] [J] == 0 ) 104 { 105 no.u = I; 106 번호 V = J; 107 no.cost = mA [I] [J] 108 ve.push_back (NO) (109) } (110) 그 밖의 111 { // 두 마을 병합 마을 사이 도로,이 때 112 MER (I, J); 113 } 114 } 115 } 116 개 INT ANS = 0 ; 117 // 정렬 118 개 정렬 (ve.begin () ve.end (), CMP), (119) 에 대해 ( int로 I = 0 ; I)는 (ve.size를 <; ++ I ) (120) { 121 // 두 마을 간의 연결이없는 경우 (122) 에 IF (! 체 (VE [I] .u VE, [I]가 .V)) (123) { 124 // 병합 125 메르 (VE [I] .u VE, [I]는 .V) 126 ANS는이 + = [I] .cost VE; 127 } 128 } (129) 의 printf ( " % D의 \의 N- " , ANS) 130 // 퍼지 용기 메모리 (131)는 ve.clear () 132 }