Wireless Network
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.
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.
4 1 0 1 0 2 0 3 0 4 O 1 O 2 O 4 S 1 4 O 3 S 1 4Sample Output
FAIL SUCCESS
思路:比較各點之間距離是否小於等於d,如果是,就並在一起。
代碼:
#include<cstdio>
#include<cstring>
#define max 1005
int x[max];
int y[max];
int f[max];
int e[max];
int k[max];
int find(int x)
{
int r=x;
while(r!=f[r]) r=f[r];
int i=x,j;
while(i!=r)
{
j=f[i];
f[i]=r;
i=j;
}
return r;
}
void merge(int x,int y)
{
int fx,fy;
fx=find(x);
fy=find(y);
if(fx!=fy) f[fy]=fx;
}
int main()
{
int n,k,p,q,i,l,d;
char s[6];
while(~scanf("%d%d",&n,&d))
{
memset(e,0,sizeof(e));
for(i=1; i<=n; i++)
f[i]=i;
for(i=1; i<=n; i++)
scanf("%d%d",&x[i],&y[i]);
while(~scanf("%s",s))
{
if(s[0]=='O')
{
scanf("%d",&k);
e[k]=1;
for(i=1; i<=n; i++)
{
l=(x[k]-x[i])*(x[k]-x[i])+(y[k]-y[i])*(y[k]-y[i]);
if(l<=d*d&&e[i])
merge(k,i);
}
}
else if(s[0]=='S')
{
scanf("%d%d",&p,&q);
if(find(p)==find(q)&&e[p]&&e[q])
printf("SUCCESS\n");
else
printf("FAIL\n");
}
}
}
}