原文:http://blog.acmj1991.com/?p=663
题意:给你n个损坏电脑所在点的坐标还有最远通信距离d。并且有两个操作:O x代表将x代号的电脑修好
S x y 问x电脑与y电脑能否通信 不一定直接通信也可以间接通信
思路:并查集 点的联通
#include<stdio.h>
#include<string.h>
#include<math.h>
#define maxN 1010
#define maxM 10010
int n,d,x[maxN],y[maxN],map[maxN][maxN],vist[maxN],f[maxN];
int max(int x,int y){return x>y?x:y;}
int low(int i,int j){
if(sqrt(double((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])))<=d)
return 1;
return 0;
}
int find(int u)
{
if(f[u]==u)return u;
int m=u,temp;
while(f[m]!=m)
m=f[m];
while(f[u]!=u){
temp=f[u];
f[u]=m;
u=temp;
}
return m;
}
void fun(int u)
{
int px,py;
for(int i=1;i<=n;i++)
if(i!=u&&vist[i]&&map[i][u]){
px=find(u);
py=find(i);
if(px!=py)f[py]=px;
}
}
int main()
{
int xx,yy,flag;
for(int i=1;i<1005;i++)
f[i]=i;
scanf("%d%d",&n,&d);
for(int i=1;i<=n;i++){
scanf("%d%d",&x[i],&y[i]);
for(int j=1;j<i;j++){
map[i][j]=map[j][i]=low(i,j);
}
}
char str[10];
while(~scanf("%s",str))
if(str[0]=='O'){
scanf("%d",&xx);
vist[xx]=1;
fun(xx);
}else{
scanf("%d%d",&xx,&yy);
if(find(xx)==find(yy))printf("SUCCESS\n");
else printf("FAIL\n");
}
}