题目链接:Wireless Network
大致题意:有n台电脑,有两个操作,修理(O)和检测联通(S),只有修好的才能连接,而且距离不超过D。起始给出n台电脑坐标。
思路:开一个vis,记录已经修好的电脑,然后每次维修的时候遍历,判断是否距离符合,可以的话直接连接。
坑:
1.编号问题 从零开始, 给的1,实际是修的0号
2.距离取等,浮点数比较
3.数据范围
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
const int maxn = 1010;
int n, d;
int s[maxn];
int dx[maxn], dy[maxn];
int vis[maxn] = {0};
int find(int x)
{
if (s[x] != x)
s[x] = find(s[x]);
return s[x];
}
void unions(int x, int y)
{
s[find(x)] = find(y);
}
double dis(int a, int b)
{
return sqrt( double(dx[a]-dx[b])*(dx[a]-dx[b]) + (dy[a]-dy[b])*(dy[a]-dy[b]) );
}
int main()
{
scanf("%d %d",&n, &d);
for (int i = 0; i <= n; i++)
s[i] = i;
for (int i = 0; i < n; i++)
scanf("%d %d",&dx[i], &dy[i]);
char op[2];
int p, q, len = 0;
while(scanf("%s",op) != EOF)
{
if (op[0] == 'O')
{
scanf("%d",&p);
p--;
vis[len++] = p;
for (int i = 0; i < len-1; i++)
{
if (vis[i] != p && dis(vis[i], p) <= (double) d)
unions(vis[i], p);
}
}
else if (op[0] == 'S')
{
scanf("%d %d", &p, &q);
p--, q--;
if (find(p) == find(q))
printf("SUCCESS\n");
else
printf("FAIL\n");
}
else
break;
}
return 0;
}