简单并查集题目
ac代码:
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
using namespace std;
int root[1010];
double loc_x[1010];//建议用double,准确些,后面需要用他进行运算
double loc_y[1010];
int isRe[1010];
void Init(int n)
{
for(int i=1;i<=n;i++){
root[i]=i;
}
}
int Find(int x)
{
while(root[x]!=x){
root[x]=root[root[x]];
x=root[x];
}
return x;
}
/*int Find(int x)
{
if(root[x]!=x){
root[x]=Find(root[x]);
}
return root[x];
}*/
//一开始老是wa,还以为是find函数写的有问题改成了递归,事实证明问题不是出在这里
void Union(int x,int y)
{
x=Find(x);
y=Find(y);
if(x!=y){
root[x]=min(x,y);
root[y]=min(x,y);//一开始这段我写的是root[x]=y,root[y]=x,我试过,这样也可ac
}
}
double Distance(int p,int q)
{
double dis=(loc_x[p]-loc_x[q])*(loc_x[p]-loc_x[q])+(loc_y[p]-loc_y[q])*(loc_y[p]-loc_y[q]);
//dis=sqrt(dis);
return dis;
}
int main()
{
int n,d;
cin>>n>>d;
Init(n);
int p=n;
memset(loc_x,0,sizeof(loc_x));
memset(loc_y,0,sizeof(loc_y));
memset(isRe,0,sizeof(isRe));
int j=1;
while(p--){
double x,y;
cin>>x>>y;
loc_x[j]=x;//注意不能loc_x[j++]=x,loc_y[j]=y或者loc_x[j++]=x,loc_y[j++]=y;仔细想想就明白了,我改了这里才ac的
loc_y[j++]=y;
}
char op;
while(cin>>op){
if(op=='O'){
int m;
cin>>m;
isRe[m]=1;
for(int i=1;i<=n;i++){
if(isRe[i]&&i!=m&&Distance(i,m)<=d*d){
Union(i,m);
}
}
}
if(op=='S'){
int a,b;
cin>>a>>b;
if(Find(a)==Find(b)){
cout<<"SUCCESS"<<endl;
}
else{
cout<<"FAIL"<<endl;
}
}
}
return 0;
}