[POJ 2236 ---ワイヤレスネットワーク]互いに素なセット

[POJ 2236 ---ワイヤレスネットワーク]互いに素なセット

トピック出典:入力するようにクリックして、[POJ 2236 -ワイヤレスネットワーク]

説明

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

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

入力

最初の行は二つの整数NおよびD(1 <= N <= 1001 0 <= D <= 20000)を含有します。ここでNは、1からNまで番号付けされているコンピュータの数であり、Dは、2台のコンピュータが直接通信可能な最大距離です。次のNラインにおいて、それぞれがN個のコンピュータの座標を2つの整数のXI、YI(0 <= XI、YI <= 10000)を含みます。(N + 1)番目の行からの入力の終わりに、一枚ずつ行われる動作があります。各行は、次の2つの形式のいずれかでの操作が含まれています。

  1. 「OのP」(1 <= p <= N)、コンピュータpを修復する手段。
  2. 「SのPQ」(1 <= P、Q <= N)、コンピュータpおよびqが通信できるかどうかをテストする手段。

入力は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

問題解決のためのアイデア

彼は説明2台のコンピュータの合併のセットに沿って接続することができれば、距離<= Dかどうかを確認するために、それをすべて修理コンピュータを横断するすべての修正コンピュータ。
すべては、同じコレクションにどのような両方のコンピュータ場合を決定するための時間を確認してください。

ACコード:

#include <iostream>
#include <algorithm>
using namespace std;
#define SIS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define endl '\n'
const int MAXN = 1e3+5;
int pre[MAXN],arr[MAXN];

struct Node
{
    int x,y;
}node[MAXN];

void init()
{
    for(int i=0;i<MAXN;i++)
        pre[i]=i;
}

int _find(int x)
{
    if(x==pre[x]) return x;
    return pre[x]=_find(pre[x]);
}

void unite(int x,int y)
{
    x=_find(x);
    y=_find(y);
    if(x!=y) pre[x]=y;
}

int dis(Node &x,Node &y)
{
    return (x.x-y.x)*(x.x-y.x)+(x.y-y.y)*(x.y-y.y);
}

int main()
{
    SIS;
    int n,d;
    init();
    cin >> n >> d;
    for(int i=1;i<=n;i++)
        cin >> node[i].x >> node[i].y;
    char ch;
    int num=0,x,y;
    while(cin >> ch)
    {
        if(ch=='O')
        {
            cin >> x;
            arr[num++]=x;
            for(int i=0;i<num-1;i++)
                if(dis(node[arr[i]],node[x])<=d*d)
                    unite(arr[i],x);
        }
        else
        {
            cin >> x >> y;
            if(_find(x)==_find(y)) cout << "SUCCESS" << endl;
            else cout << "FAIL" << endl;
        }
    }
    return 0;
}
公開された412元の記事 ウォンの賞賛135 ・は 40000 +を見て

おすすめ

転載: blog.csdn.net/qq_41879343/article/details/104162598