集計-2
2370 ワード
タイトルの説明:
東南アジアで地震が発生した.残念なことに、ACM組織はコンピュータ履歴書の無線ネットワークを通じて壊滅的な影響を受けた--ネットワーク内のすべてのコンピュータが破損した.メンテナンス後、ワイヤレスネットワークが徐々に稼働し始めました.ハードウェアの制約のため、2台のコンピュータはdメートルを超えない距離を維持してこそ、直接通信することができるが、1台のコンピュータは他の2台のコンピュータ通信の仲介点とすることができる.すなわち、AコンピュータとBコンピュータが直接通信できる範囲内でない場合、AコンピュータとBコンピュータと通信するCコンピュータを同時に介して間接的な通信関係を確立することができる.
修理の過程で、修理者は2つの操作を行うことができます:1台のコンピュータを修理するか、2台のコンピュータの間で通信できるかどうかを検査して、あなたの任務は毎回の検査操作を解くことです.
入力:
1行目は2つの整数Nとd(1<=N<=1000,0<=d<=2000)を含み、Nはコンピュータの数を表し、コンピュータの番号は1からNまでであり、dは2台の直接通信可能なコンピュータが保持する距離の最大値である.次のN行である.各行は2つの整数xとyを含む(0<=x,y<=10,000)は、N台のコンピュータの座標を表し、次の一連の入力は、修理者の操作を表すものよりも、各操作は以下の2つの操作のうちの1つである.
①「O p」(1<=p<=N)は、p台目のコンピュータの修理を示す.
②「S p q」(1<=p,q<=N)は、pとqコンピュータが通信可能か否かを検出することを示す.
出力:
各グループの検出操作について、2台のコンピュータが通信可能であれば「SUCCESS」を出力し、そうでなければ「FAIL」を出力する
サンプル入力:
4 1
0 1
0 2
0 3
0 4
0 5
O 1
O 2
O 4
S 1 4
O 3
S 1 4
サンプル出力:
FAIL
SUCCESS
東南アジアで地震が発生した.残念なことに、ACM組織はコンピュータ履歴書の無線ネットワークを通じて壊滅的な影響を受けた--ネットワーク内のすべてのコンピュータが破損した.メンテナンス後、ワイヤレスネットワークが徐々に稼働し始めました.ハードウェアの制約のため、2台のコンピュータはdメートルを超えない距離を維持してこそ、直接通信することができるが、1台のコンピュータは他の2台のコンピュータ通信の仲介点とすることができる.すなわち、AコンピュータとBコンピュータが直接通信できる範囲内でない場合、AコンピュータとBコンピュータと通信するCコンピュータを同時に介して間接的な通信関係を確立することができる.
修理の過程で、修理者は2つの操作を行うことができます:1台のコンピュータを修理するか、2台のコンピュータの間で通信できるかどうかを検査して、あなたの任務は毎回の検査操作を解くことです.
入力:
1行目は2つの整数Nとd(1<=N<=1000,0<=d<=2000)を含み、Nはコンピュータの数を表し、コンピュータの番号は1からNまでであり、dは2台の直接通信可能なコンピュータが保持する距離の最大値である.次のN行である.各行は2つの整数xとyを含む(0<=x,y<=10,000)は、N台のコンピュータの座標を表し、次の一連の入力は、修理者の操作を表すものよりも、各操作は以下の2つの操作のうちの1つである.
①「O p」(1<=p<=N)は、p台目のコンピュータの修理を示す.
②「S p q」(1<=p,q<=N)は、pとqコンピュータが通信可能か否かを検出することを示す.
出力:
各グループの検出操作について、2台のコンピュータが通信可能であれば「SUCCESS」を出力し、そうでなければ「FAIL」を出力する
サンプル入力:
4 1
0 1
0 2
0 3
0 4
0 5
O 1
O 2
O 4
S 1 4
O 3
S 1 4
サンプル出力:
FAIL
SUCCESS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
int map[1005][1005];//
int f[1005];
int mul(int x)
{
return x * x;
}
int find(int x)
{
if(f[x] != x)
f[x] = find(f[x]);
return f[x];
}
void make(int a, int b)
{
int f1 = find(a);
int f2 = find(b);
if(f1 != f2)
f[f2] = f1;
}
void check(int a, int b)
{
int f1 = find(a);
int f2 = find(b);
if(f1 == f2)
{
printf("SUCCESS
");
return ;
}
printf("FAIL
");
}
int main()
{
int n, flag[1005];//flag
double d;
memset(map, 0, sizeof(map));
memset(flag, 0, sizeof(flag));
scanf("%d%lf", &n, &d);
int x[1005], y[1005], i, j, k;
for(i = 1; i <= n; i ++)
scanf("%d%d", &x[i], &y[i]);
for(i = 1; i <= n; i ++)
f[i] = i;
for(i = 1; i < n; i ++)
for(j = i+1; j <= n; j ++)
if(sqrt((double)(mul(x[i]-x[j])+mul(y[i]-y[j]))) <= d)
{
map[i][j] = 1;
map[j][i] = 1;
}
char s[5];
int a, b;
while(scanf("%s", s) != EOF)
{
if(strcmp(s, "O") == 0)
{
scanf("%d", &a);
flag[a] = 1;
for(i = 1; i <= n; i ++)
if(map[i][a] && flag[i])
make(a, i);
}
else
{
scanf("%d%d", &a, &b);
check(a, b);
}
}
return 0;
}