도로의 POJ을 구축 - 2421 크루스 칼 최소의 트리 알고리즘을 스패닝

이 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.

산출

당신은 출력 라인은 모든 도로의 길이는 모든 마을이 연결되도록 구축 할 수있는 정수를 포함해야하며,이 값은 최소이다.

샘플 입력

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 }

 



추천

출처www.cnblogs.com/mzchuan/p/11729167.html