無線ネットワークPOJ - 2236セット及び変換は座標点をチェック

地震が東南アジアで行われます。ACM(アジア間連携医療チーム)がラップコンピュータとワイヤレスネットワークを設定しましたが、予想外の余震が攻撃、ネットワーク内のすべてのコンピュータはすべて壊れていました。コンピュータは、一つ一つを修復され、そしてネットワークが徐々に再び仕事を始めました。、ハードウェア制限により、各コンピュータは、直接からDメートルよりも遠くないコンピュータと通信することができます。すべてのコンピュータは、2台の他のコンピュータとの間の通信の仲介者としてみなすことができるが、それは、コンピュータAとコンピュータBが直接通信できる場合、コンピュータAとコンピュータBが通信することができると言うことであるか、またはその両方Aと通信することができるコンピュータ・CがあるとB. 

ネットワークを修復する過程では、労働者は2台のコンピュータが通信できる場合、コンピュータ、またはテストを修復、すべての瞬間において業務の2種類を取ることができます。あなたの仕事は、すべてのテスト作業に答えることです。 

入力

最初の行は、N及びD(1 <= N <= 1001 0 <= D <= 20000)は、2つの整数を含みます。ここでNは、1からNまで番号付けされているコンピュータの数であり、Dは、2台のコンピュータが直接通信可能な最大距離です。次のNラインにおいて、それぞれがN個のコンピュータの座標を2つの整数のXI、YI(0 <= XI、YIを<= 10000)、含まれています。(N + 1)番目の行からの入力の終わりに、一枚ずつ行われる動作があります。各ラインは、次の2つの形式のいずれかで動作が含まれている 
コンピュータPの修復を意味し、1「OのP」(1 <= p <= N)。 
2.コンピュータpおよびqが通信できるかどうかのテストを意味し、 "S PがQ"(1 <= P、Q <= N)。 

入力は300000行を超えることはありません。 

出力

各試験操作、印刷、「SUCCESS」2台のコンピュータが通信する、またはことができるかどうかについて、「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破損コンピュータがあり、コンピュータAとBは、2つに接続することができ、D Mに一緒に接続することができ、B及びCは接続することができ、その後、B cは接続することができます。
次に、2つの操作、大文字Oと大文字Sがあり、Oは、試験AとBとの間の接続かどうかを示すS、修復破損コンピュータを表します。最初の行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 <入出力ストリーム>
15件 の#define MOD 998244353の
 16  の#defineのEPS 1E-6
17  の#define LLロングロング
 18である の#define INFの0x3f3f3f3f
 19。 使用した 名前空間STD;
 20である 
21ことである // コンピュータの座標記録
22である 構造体ノード
 23は 、{
 24      のint X、Y;
 25  };
 26であるノードNO [ 1005 ];
 27  //はエネルギーを節約x番目のコンピュータに接続されたコンピュータ
28のベクトル< INT > [VE 1005に];
 29  // コンピュータが修復されているかどうかを節約
30  BOOL VIS [ 1005 ];
 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-によって)*(Ay- によって);
 71である }
 72  // 設定修復コンピュータxおよびxに×セットが接続されています合成
73は、 空隙アップデータ(INT X)
 74  {
 75     VIS [X] = trueに76      のためにINT I = 0 ;私はVE <[X] .size();私は++ 77      {
 78          // X連鎖性の点
79          INT Y = VE [X] [I]。
 80          // 合流点yがxとy起こされている場合
81を         IF(VIS [Y] &&!チェ(X、Y))
 82          {
 83              Merの(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-; Iは++ 100      {
 101          のためのINTJ = I + 1、J <= N; J ++ 102          {
 103              場合(distan(NO [I]、NO [J])<= D * D)
 104              {
 105                  [i]は.push_back(J)ましありません。
106は、                 VEの[J] .push_back(I)。
107              }
 108          }
 109      }
 110      チャーCH。
111      INTのA、B。
112      一方(scanf関数(" %のC "、&​​CH)!= EOF)
 113      {
 114          もし(CH == ' O ' 115          {
 1 16              scanfの(" %のD "、&​​A );
 117              アップデータ(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