集計-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
#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; }