对于我而言感觉还是有点难度的.......
在预处理那一块
每次修好了 就和其他修好的电脑循环一次 如果距离小于指定距离 就连接在一起
虽然思路很清晰 但还是写了半天
猛男落泪。
不过一发入魂的感觉还不错哈哈哈哈哈哈。
/*
qq:1239198605
ctgu_yyf
*/
#include<iostream>
#include<cstdio>
#include<string>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
struct Point{
int x,y;
};
Point point[1005];
int par[1005];
int vis[1005];
int n;
int d;
bool dis(int a,int b)
{
int xx=point[a].x-point[b].x;
int yy=point[a].y-point[b].y;
// cout<<xx*xx<<"***"<<yy*yy<<"**"<<d*d<<endl;
if((xx*xx+yy*yy)<=d*d)
return true;
return false;
}
void init(int n)
{
for(int i=1;i<=n;i++)
par[i]=i;
}
int find(int x)
{
if(par[x]==x)
return x;
else
return par[x]=find(par[x]);
}
void unite(int x,int y)
{
x=find(x);
y=find(y);
if(x==y)
return ;
par[y]=x;
}
bool same(int x,int y)
{
return find(x)==find(y);
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>d;
for(int i=1;i<=n;i++)
cin>>point[i].x>>point[i].y;
init(n);
memset(vis,0,sizeof(vis));//初始化让所有电脑坏掉
char k;
int kk;
int uu,vv;
while(cin>>k)
{
if(k=='O')
{
cin>>kk;
vis[kk]=1;//kk电脑修好
for(int i=1;i<=n;i++)
{
if(i!=kk&&dis(i,kk)&&vis[i]==1)
{unite(i,kk);
// cout<<i<<" "<<kk<<"**"<<endl;
}
}
}
else if(k=='S')
{
cin>>uu>>vv;
if(same(uu,vv)==true)
cout<<"SUCCESS"<<endl;
else
cout<<"FAIL"<<endl;
}
}
return 0;
}