#include <iostream>
using namespace std;
typedef pair<int, int> P;
P nodes[1007];
bool flag[1007];
int par[1007], ranks[1007], N, d;
void init()
{
for (int i = 0; i <= 1006; i++)
{
par[i] = i;
ranks[i] = 1;
}
}
int find(int x)
{
if (x == par[x])
{
return x;
}
else
{
return par[x] = find(par[x]);
}
}
void unite(int x, int y)
{
x = find(x);
y = find(y);
if (x == y)
{
return;
}
if (ranks[x] < ranks[y])
{
par[x] = y;
}
else
{
par[y] = x;
if (ranks[x] == ranks[y])
{
ranks[x]++;
}
}
}
bool same(int x, int y)
{
return find(x) == find(y);
}
void input()
{
scanf("%d%d", &N, &d);
for (int i = 1; i <= N; i++)
{
scanf("%d%d", &nodes[i].first, &nodes[i].second);
}
}
void solve()
{
char op;
int x, y;
while (scanf("\n%c", &op) != EOF)
{
if (op == 'S')
{
scanf("%d%d", &x, &y);
if (same(x, y))
{
printf("SUCCESS\n");
}
else
{
printf("FAIL\n");
}
}
else if (op == 'O')
{
scanf("%d", &x);
flag[x] = true;
for (int i = 1; i <= N; i++)
{
if (!flag[i] || same(i, x))
{
continue;
}
int x_2 = (nodes[i].first - nodes[x].first) * (nodes[i].first - nodes[x].first);
int y_2 = (nodes[i].second - nodes[x].second) * (nodes[i].second - nodes[x].second);
if ((x_2 + y_2) <= (d * d))
{
unite(x, i);
}
}
}
}
}
int main()
{
input();
init();
solve();
return 0;
}
POJ 2236 Wireless Network 并查集
最新推荐文章于 2024-05-23 20:47:46 发布