题目链接
简单的 Union&Find 的板子题
AC代码:
#include <iostream>
#include <math.h>
#include <stdio.h>
using namespace std;
typedef long long ll;
#define N 1006
ll fa[N];
ll repair[N];
void inf()
{
for(ll i=1;i<N;i++)
{
fa[i]=i;
}
}
ll Find(ll x)
{
if(x!=fa[x])
fa[x]=Find(fa[x]);
return fa[x];
}
void Union(ll x,ll y)
{
ll a=Find(x);
ll b=Find(y);
if(a!=b)
{
fa[a]=b;
}
}
double dist(ll x,ll y,ll m,ll n)
{
double ans=sqrt((x-m)*(x-m)+(y-n)*(y-n));
return ans;
}
int main()
{
ll n,d;
cin>>n>>d;
ll x[n+1],y[n+1];
for(ll i=1;i<=n;i++)
{
cin>>x[i]>>y[i];
}
inf();
char c;
ll k=0;
while(cin>>c)
{
if(c=='O')
{
ll p;
cin>>p;
repair[k++]=p;
for(ll i=0;i<k;i++)
{
if(repair[i]!=p&&
dist(x[repair[i]],
y[repair[i]],
x[p],y[p])<=d)
{
Union(p,repair[i]);
}
}
}
else if(c=='S')
{
ll p,q;
cin>>p>>q;
if(Find(p)==Find(q)) puts("SUCCESS");
else puts("FAIL");
}
}
}