ワイヤレスネットワーク(互いに素セット)

問題の説明

地震が東南アジアで行われます。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」の場合ではありません。

サンプル入力

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




サンプル出力

FAIL 
SUCCESS
質問の意味
  すべてのラインが壊れているコンピュータネットワークがあり、今、あなたは両方の操作を行うことができ、修理(O)と検出をコンピュータネットワークがn個
 
2台のコンピュータのみで通信するコンピュータを修理し、(S)が通信しています。与えられ超えることができない二つのコンピュータからルール通信があります
 
最大距離D(最初のnは、コンピュータを調整します)。2台のコンピュータが通信できるときに出力するかどうかを検出
アイデア:

単純なアプリケーションをチェックし、設定します。私は、構造、各コンピュータの記録状態を使用。

コンピュータの状態に指定されたタイトルが更新されるによると、それはオードのコレクション全体にマージされるかどうかを確認するために、コンピュータにアクセスするためにトラバース!

注意:時間は、現在のコンピュータへのルートからの距離を計算すると考えることはできません!

#include <iostreamの> 
する#include <cmath> 
の#include <CStringの> 
する#include <cstdioを>
 使用して 名前空間STD。
INT [ 1005 ]、[B 1005 ]。
構造体ノード
{ 
    ダブルX、Y。
} P [ 1005 ]。
INT GETF(INT X)
{ 
    場合(X == B [X])
         戻りX。
    戻り B [X] = GETF(B [X])。
} 
ボイドマージ(int型のx、int型のY)
{ 
    int型交流; = GETF(X)。
    C = GETF(Y)。
    もし(!= C)
        B [C] = 
} 
int型のmain()
{ 
    int型、X、Y、N。
    ダブルD;
    チャー C [ 2 ]。
    CIN >> N >> D。
    memset(0はsizeof (a)参照)。
    以下のためにint型 iは= 0 ; iが< 1005 ; iは++ 
        B [i]は = I。
    以下のためのint型私は=1 ; I <= N。I ++ 
        CIN >> P [i]は.X >> のP [I] .Y。
    N = 0 一方、(CIN >> C)
    { 
        もし、(C [ 0 ] == ' O ' 
        { 
            CIN >> X。
            int型 iは= 0 ; iがN <I ++は
            { 
                ダブル。TX = P [I] X、TY = P [I] Y、EX = P [X] .X、EY = P [X] .Y。
                ダブル L = SQRT((TX-EX)*(TX-EX)+(TY-EY)*(TY-EY)+ 0.0 )。
                もし(L <= D)
                    ([I]、X)をマージします。
            } 
            [N ++] =のX。
        } 
        もし、(C [ 0 ] == ' S ' 
        { 
            CIN >> X >> Y。
            もし(GETF(X)== GETF(Y))
                プット(" SUCCESS " )。
            他の
                プット(" FAIL " ); 
        } 
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/dwj-2019/p/11360981.html