题意:
有n台电脑,都是坏的,现在可以执行两种操作,修好某台电脑,判断俩电脑是否相连(可传递相连)
给你电脑坐标和最大相连距离(即电脑好的且小于等于这个距离,就表示相连)
题解:
很简单,建立并查集,还有isok数组,表示电脑是否ok,对于每一个O操作都要将所有和他相连的都uint
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<queue>
#define pr(x) cout<<#x<<" "<<x;
#define pl(x) cout<<#x<<" "<<x<<endl;
#include<math.h>
#include<algorithm>
#define ll long long
using namespace std;
int dx[1005];
int dy[1005];
bool isok[1005];
int fa[1005];
int n, d;
int init(int n){
for(int i = 0 ;i < n;i++){
fa[i] = i;
isok[i] = false;
}
}
int find(int i){
if(i != fa[i]){
fa[i] = find(fa[i]);
}
return fa[i];
}
bool dis(int i, int j){
int a = dx[i] - dx[j];
int b = dy[i] - dy[j];
if(a*a + b*b <= d*d){
return true;
}
return false;
}
int main(){
cin >> n >> d;
init(n);
for(int i = 0;i < n; i++){
cin >> dx[i] >> dy[i];
}
char ch;
while(cin >> ch){
if(ch == 'O'){
int r;
cin >> r;
isok[r-1] = true;
for(int i = 0;i <n;i++){
if(i != r-1 && isok[i] && dis(i,r-1)){
int a = find(r-1);
int b = find(i);
fa[a] = b;
}
}
}
if(ch == 'S'){
int a,b;
cin >> a >> b;
int k,j;
k = find(a-1);
j = find(b-1);
if(k == j){
cout<<"SUCCESS"<<endl;
}
else{
cout<<"FAIL"<<endl;
}
}
}
return 0;
}