POJ - 2236 Wireless Network (kuangbin - 簡單搜尋)

iamcht發表於2020-10-03

題目描述(已轉換成中文)

  南亞發生了一次地震。ACM (Asia Cooperated Medical 亞洲聯合醫療隊) 已經為膝上型電腦搭建了一個無線網路,但受到了一次不可預知的餘震攻擊,因此網路中的所有電腦都被破壞了。電腦被逐臺修復,網路逐步恢復了工作。由於受到硬體的約束,每臺電腦只能與距離它不超過 d 米的其它電腦直接通訊。但每臺電腦可被看作其它兩臺電腦的通訊中轉點,也就是說,如果電腦 A 和電腦 B 可以直接通訊,或存在一臺電腦 C 既可與 A 也可與 B 通訊,那麼電腦 A 和電腦 B 之間就能夠通訊。

  在處理網路修復的過程中,工作人員們在任何一個時刻,可以執行兩種操作:維修一臺電腦,或測試兩臺電腦是否能夠通訊。請您找出全部的測試操作。

輸入格式

  第一行包含了兩個整數 N 和 d (1 <= N <= 1001, 0 <= d <= 20000)。此處 N 是電腦的數目,編號從 1 到 N;同時,D 是兩臺電腦之間能夠直接通訊的最大距離。接下來的 N 行,每行包含兩個整數 xi, yi (0 <= xi, yi <= 10000),表示 N 臺電腦的座標。從第 (N+1) 行到輸入結束,是逐一執行的操作,每行包含一個操作,格式是以下兩者之一:
  1. “O p” (1 <= p <= N),表示維護電腦 p 。
  2. “S p q” (1 <= p, q <= N),表示測試電腦 p 和 q 是否能夠通訊。
  輸入不超過 300000 行。

輸出格式

  對於每個測試操作,如果兩臺電腦能夠通訊,則列印 “SUCCESS”;否則,列印 “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

題目連結

分析:

  

這道題需要注意的地方:

  

程式碼如下:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <map>
#include <queue>
using namespace std;
typedef long long LL;
const int maxn = 1005;
int n, d, vis[maxn][maxn], a[maxn], fu[maxn];
int read(){
	int x, f = 1;
	char ch;
	while(ch = getchar(), ch < '0' || ch > '9') if(ch == '-') f = -1;
	x = ch - '0';
	while(ch = getchar(), ch >= '0' && ch <= '9') x = x * 10 + ch - 48;
	return x * f;
}
struct node{
	int x, y;
}u[maxn];
void pre(){
	int i, j, dx, dy;
	for(i = 1; i <= n; i++){
		for(j = i + 1; j <= n; j++){
			dx = u[i].x - u[j].x;
			dy = u[i].y - u[j].y;
			if(dx * dx + dy * dy <= d * d) vis[i][j] = vis[j][i] = 1;
			else vis[i][j] = vis[j][i] = 0;
		}
	}
}
int found(int x){
    if(fu[x] == x) return x;
    return fu[x] = found(fu[x]);
}
void unit(int x, int y){
    if(found(x) == found(y)) return;
    else fu[found(x)] = found(y);
}
int main(){
	int i ,j, t, x, y;
	char c;
	n = read();
	d = read();	
	for(i = 1; i <= n; i++){
		u[i].x = read();
		u[i].y = read();
		fu[i] = i;
	}
	pre();
	while(~scanf("%c", &c)){
		if(c == 'O'){
			t = read();
			a[t] = 1;
			for(i = 1; i <= n; i++){
				if(a[i] && vis[i][t]){
					unit(t, i);
				}
			}
		}
		else{
			x = read();
			y = read();
			if(found(x) == found(y)) printf("SUCCESS\n");
	    	else printf("FAIL\n");
		}
	}
	return 0;
}

相關文章