Time Limit: 10000MS | Memory Limit: 65536K | |
Total Submissions: 31880 | Accepted: 13283 |
Description
In the process of repairing the network, workers can take two kinds of operations at every moment, repairing a computer, or testing if two computers can communicate. Your job is to answer all the testing operations.
Input
1. "O p" (1 <= p <= N), which means repairing computer p.
2. "S p q" (1 <= p, q <= N), which means testing whether computer p and q can communicate.
The input will not exceed 300000 lines.
Output
Sample Input
4 1 0 1 0 2 0 3 0 4 O 1 O 2 O 4 S 1 4 O 3 S 1 4
Sample Output
FAIL SUCCESS
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <string.h>
using namespace std;
int x[1005], y[1005], p[1005];
bool flag[1005];
int findset(int x){
return p[x] == x ? x : p[x] = findset(p[x]);
}
int main(){
int n, d, u, v;
scanf("%d %d", &n, &d);
d *= d;
for(int i = 1; i <= n; ++i){
scanf("%d %d", &x[i], &y[i]);
}
char s[5];
memset(flag, false, sizeof(flag));
for(int i = 1; i <= n; ++i){
p[i] = i;
}
while(scanf("%s", s) != EOF){
if(s[0] == 'O'){
scanf("%d", &u);
for(int i = 1; i <= n; ++i){
if(flag[i] == true){
if((x[i] - x[u]) * (x[i] - x[u]) + (y[i] - y[u]) * (y[i] - y[u]) <= d){
p[findset(i)] = findset(u);
}
}
}
flag[u] = true;
}
else{
scanf("%d %d", &u, &v);
if(findset(u) != findset(v)){
printf("FAIL\n");
}
else{
printf("SUCCESS\n");
}
}
}
}
/*
題意:
1000臺電腦,現在全部壞了,好的電腦之間距離不超過d的可以進行通信,現在修一部分電腦,詢問兩臺
電腦之間是否可以直接或間接的通信。
思路:
並查集 入門題。每次修的時候維護一下和好的電腦且距離滿足要求的電腦之間的集合關係。詢問時就直接看
兩臺電腦是否在一個集合即可。
*/