무선 네트워크 POJ - 2236 세트 변환이 좌표 점을 확인

지진은 동남 아시아에서 일어난다. ACM (아시아 제공처 의료 팀이) 무릎 컴퓨터와 무선 네트워크를 설정했지만, 예상치 못한 여진 공격, 네트워크의 모든 컴퓨터는 모든 졌 있었다. 컴퓨터는 하나 하나를 수리하고, 네트워크는 점차적으로 다시 작동하기 시작했다. 때문에 하드웨어를 제한의 각 컴퓨터는 직접 D로부터보다 멀리 떨어져 있지 않은 컴퓨터와 통신 할 수있다. 그러나 모든 컴퓨터는 다른 두 컴퓨터 간의 통신을 매개로 간주 될 수 있으며, 그 컴퓨터 A와 컴퓨터 B가 직접 통신 할 수 또는 A 모두와 통신 할 수있는 컴퓨터 C가있는 경우 컴퓨터 A와 컴퓨터 B가 통신 할 수 있다고하는 것이다 비. 

네트워크를 수리하는 과정에서 작업자가 컴퓨터 수리, 또는 두 컴퓨터가 통신 할 수 있는지 테스트, 매 순간에 작업 두 종류의 수 있습니다. 당신의 임무는 모든 테스트 작업을 대답하는 것입니다. 

입력

첫 번째 라인은 N과 D (1 <= N <= 1,001, 0 <= D <= 20000) 두 정수를 포함한다. 여기서 N은 1 내지 N 번째하는 컴퓨터의 수이고, D는 두 개의 컴퓨터가 직접 통신 할 수있는 최대 거리이다. 다음 N 라인에서, 각각의 N은 시스템의 좌표 두 정수 XI 이순신 (0 <= XI 이순신 <= 10000) 함유한다. 입력의 종료까지 (N + 1) 번째 행에서 하나씩 수행되는 작업이있다. 각 라인은 두 형식은 다음 중 하나의 동작을 포함 
컴퓨터를 복구하는 수단 (P) 1. "O를 P '(1 <= p <= N). 
컴퓨터 p와 q가 통신 할 수 있는지 여부를 테스트 수단 2. "S P는 Q '(1 <= P, Q <= N). 

입력 라인은 300,000를 초과하지 않을 것이다. 

산출

각각의 테스트 작업, 인쇄 "성공"두 컴퓨터가 통신, 또는 할 수있는 경우를 들어 "FAIL"만약 없습니다.

샘플 입력

4 1 
0 1 
0 2 
0 3 
0 4 
O 1 
O 2 
O 4 
S 1~4 
O 3 
S 1~4

샘플 출력

FAIL 
SUCCESS의 

문제의 의미 N 컴퓨터는 컴퓨터가 개발 m, (A)에 함께 접속 될 수 있고, B는 2 개에 연결될 수 있으며,이 손상은, B 및 C에 접속 될 수 있고,이어서 B (C)는 접속 될 수있다.
두 개의 작업 대문자 O와 대문자 S가 O가 S를 나타내는 수리 손상된 컴퓨터를 나타내는 존재하는지 여부를 시험 A와 B 사이의 연결. 첫 번째 열 (N)의 입력 (D).
N은 시스템의 n 번째 행의 위치를 나타내고, 그 후 문 아래에서, 각 명령의 실행, 테스트 용 문장이 출력되는 테스트 결과가 SUCCESS 또는 FAIL이다.

아이디어 : 단순 이산 집합은 최초의 좌표 시스템 사이의 관계는 최종 결정에 점 사이의 관계를 확인하는 농도로 변환된다.

코드 :
  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  // 컴퓨터의 좌표 기록 
22 것은  구조체 노드
 (23)가  {
 24      INT의 X, Y,
 25  }
 26없는 노드에 [ 1005 ]
 27  // 에너지 절약 상기 X 번째 컴퓨터에 접속 된 컴퓨터 
(28) 의 벡터 < INT > [VE 1,005 ]
 29  // 컴퓨터를 복구 여부에 저장 
30  BOOL VIS [ 1,005 ]
 31은  
32 // FA [X] (X)의 먼 조상 나타내고 
33은  INT FA [ 50002 ]
 (34)가  // 초기화에 개별적으로 설정된 각각의 시작점 
(35)  보이드 빌드 ( INT qwq) 
 36  {
 37      위해 ( INT I = . 1 ; I <= qwq; I는 ++ )
 (38)가      {
 39          FA [I] = I는,
 40      }
 (41)이      복귀 ;
 42이다  } 
 43 인  // x의 가장 먼 조상을 찾아 압축 경로 
(44)는  INT의 발견 ( INT X)
 45  {
 46은      IF(FA [X] == X)
 47      {
 48          리턴 X;
 49      }
 50      리턴 FA [X] = 찾기 (FA [X]);
 51이다  }
 (52)이다  // 결정된 X는 Y가 동일한 세트가 아닌, 직접적인 먼 조상을 분석하는 동일하지 않은 
53 인  BOOL 체 ( INT (X), INT의 Y)
 (54)가  {
 55      반환 (X) == 찾기 (Y) 찾기;
 56이다  }
 (57)이다  // 결합 된 X, Y, 우리는 x와 y가 결정 동일한는이 설정되지 않은
 58  @ 경로 압축 FA는 [X], FA [Y 후 ] 이미 먼 조상,
 59  // 그래서 직접 FA는 [X] 성부 FA [Y]에 접속 조상 
60  메르 ( INT의 X, int로 Y)를
 (61)는  {
 (62)는      IF (! 체는 (X는, Y)) 
 (63)가      {
 64          FA [FA [X] = FA [Y]
 65      }
 66      ;
 67  }
 68  INT Distan (노드 A 노드 B)
 (69)  {
 70      반환 (BX-AX) * (AX-BX) + (AY-) ※ (와우 - 화끈한데 의해)
 71이다  }
 72  // 설정 수리 컴퓨터 (X)에 x를 설정하고 X가 연결된 합한 
73은  보이드 UPDATA ( INT X)
 74  {
 75     VIS [X] = ,
 76       ( INT I = 0 ; I는 VE <[X] 크기는 (); I는 ++ )
 77      {
 78          // 상기 X 연결 지점 
(79)          INT Y = VE [X] [I];
 80          // 병합 지점 y는 x와 y 깨어날 경우 
81          IF (VIS [Y] &&! 체 (X, Y))
 82          {
 83              메르 (X, Y);
 84          }
 85      }
 86  }
 87  INT 의 main ()
 88  {
 89      INT의 N-, D,
 90      는 scanf (" %의 D %의의 D " , N- & D)
 (91)이다      // 초기화 정보 
(92)      , 빌드 (N-)
 93      // 기록 포인트 정보 
(94)      에 대해 ( INT I = . 1 I <= N-; I는 ++ )
 95      {
 96          는 scanf ( " %의 D %의의 D " , NO [I] .x와, NO [I] .Y);
 97      }
 98      // 함께 연결될 수 지점 사이 판정 트래버스 
(99)      에 대해 ( INT I = . 1 ; I <= N-; 내가 ++ )
 100      {
 (101)          에 대한 ( INTJ = I는 + 1 , J <= N; J ++ )
 102          {
 103              경우 (distan (NO [I] 없음 [J]) <= D * d)
 (104)              {
 105                  적이 [I] .push_back (j);
106                  적이 [J] .push_back (I);
107              }
 108          }
 109      }
 110      CH;
111      INT의 A, B;
112      동안 (는 scanf ( " %의 C " , 및 CH)! = EOF)
 113      {
 114          경우 (CH2 == ' O ' )
115          {
 (116)              는 scanf ( " %의 D " , & A )
 117              UPDATA (A)
 1 (18)          }
 (119)          다른  IF (CH == ' S ' )
 (120)          {
 121              는 scanf ( " %의 D %의의 D ' , A, 및 B);
 122              // 두 함께 결합 될 수 나타낼 때 동일한 상위의 두 지점 
(123)              에 IF (찾기 (a) == 찾기 (B))
 124              {
 125                  의 printf ( " N- \ SUCCESS " );
126              }
 127              밖의 
128              {
 129                  의 printf ( " FAIL \ n을 " );
130              }
 131          }
 132      }
 133 }

 

추천

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