[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つの形式のいずれかでの操作が含まれています。
- 「OのP」(1 <= p <= N)、コンピュータpを修復する手段。
- 「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;
}