传送门:Wireless Network
题意:题目说的是给出一些坏电脑的坐标,再给出任意个操作,操作为修复一台电脑,或者判断两台电脑是否可以联网。
思路:可以当做并查集模板题来做,很简单。我们需要三个数组,一个来记录电脑坐标,一个来记录电脑是否修好了,最后一个来记录该电脑的的祖宗节点电脑。
第一种操作"O p" (1 <= p <= N),其实就是记录哪台电脑修好以及合并集合的过程;
第二种操作 “S p q” (1 <= p, q <= N),就是询问两个电脑所在的集合是否相同,相同输出"SUCCESS",否则输出"FAIL"。
代码:
#include<iostream>
#include<stdio.h>
using namespace std;
struct node{
int x,y;
}a[1005];
int f[1005];//祖宗节点数组
int n,d;
bool vis[1005];//标记电脑是否修好了
int find(int x)//查找祖宗节点并返回祖宗节点
{
if(f[x]!=x) f[x]=find(f[x]);
return f[x];
}
int jisuan(int i,int j)
{
return (a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y);
}
int main()
{
cin>>n>>d;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
}
char s[3];
for(int i=1;i<=n;i++)
f[i]=i;
while(scanf("%s",s)!=EOF)
{
if(s[0]=='O')
{
int k;
scanf("%d",&k);
if(vis[k]) continue;
vis[k]=1;
for(int i=1;i<=n;i++)
{
if(jisuan(i,k)<=d*d&&vis[i])
{
if(find(i)!=find(k))//判断条件可要可不要
f[find(i)]=find(k);
}
}
}
else{
int p,q;
scanf("%d%d",&p,&q);
if(find(p)==find(q))
{
puts("SUCCESS");
}
else puts("FAIL");
}
}
return 0;
}