并查集模板题
大意是给你几台机器,O让你修理,S是测试是否可以通信
先是n台机器,还有可以连接的最大距离d,下面给出机器的坐标,
你可以修一台机器就标记一下,代码里有注释
需要注意的地方是不可以用路径压缩,会错
#include<stdio.h>
#include<string.h>
#include<math.h>
struct node
{
int x,y,pre;
} p[10010];
int pre[10010],book[10010],d;
int find(int x)
{
return x==p[x].pre?x:find(p[x].pre);
}
void join(node p1,node p2)
{
int r1,r2;
r1=find(p1.pre);
r2=find(p2.pre);
if(r1!=r2)
if((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)<=d*d)//判断距离
p[r2].pre=r1;//如果可以就连起来
}
int main()
{
int m,n,from,to,ok;
char c;
scanf("%d%d",&n,&d);
for(int i=1;i<=n;i++)
p[i].pre=i;
for(int i=1; i<=n; i++)
scanf("%d%d",&p[i].x,&p[i].y);
memset(book,0,sizeof(book));
while(~scanf("\n%c",&c))
{
if(c=='O')
{
scanf("%d",&ok);
book[ok]=1;//修理
for(int i=1; i<=n; i++)
{
if(book[i]&&i!=ok)
join(p[i],p[ok]);
}
}
else
{
scanf("%d%d",&from,&to);
if(find(from)==find(to))//如果在同一个源点上就success
printf("SUCCESS\n");
else printf("FAIL\n");
}
}
return 0;
}