Advanced Data Structures :: Disjoint Set
Description
有个无线网络,网络里的主机只要在一定距离内就可以互相通讯,
只要主机开启,主机间的通讯可以任意传递。
刚开始,假设网络中的主机都是关闭着的。
现在会进行一些操作,这些操作会将一些主机打开,
或者询问你两台主机之间能否通讯。
对于每个询问,输出询问的结果。
Type
Advanced Data Structures :: Disjoint Set
Analysis
利用并查集。
每次开启一台主机,就暴力一下所有在他范围内,
且打开的主机,然后将他们并起来即可。
Solution
// POJ 2236
// Wireless Network
// by A Code Rabbit
#include <cmath>
#include <cstdio>
#include <cstring>
template <typename T>
struct Point {
T x, y;
static double GetDistance(Point a, Point b) {
return sqrt(pow(a.x - b.x, 2) + pow(a.y - b.y, 2));
}
};
const int MAXN = 1003;
struct DisjointSet {
int p[MAXN];
void Init(int);
void Make(int x) { p[x] = x; }
int Find(int x) { return p[x] == x ? x : p[x] = Find(p[x]); }
int Union(int x, int y) { p[Find(x)] = Find(y); }
};
void DisjointSet::Init(int n) {
for (int i = 1; i <= n; i++)
Make(i);
}
int n, d;
char ch;
int p, q;
Point<int> pt[MAXN];
bool bo[MAXN];
DisjointSet set;
int main() {
scanf("%d%d", &n, &d);
for (int i = 1; i <= n; i++)
scanf("%d%d", &pt[i].x, &pt[i].y);
memset(bo, false, sizeof(bo));
set.Init(n);
while (1) {
getchar();
if ((ch = getchar()) == EOF) break;
if (ch == 'O') {
scanf("%d", &p);
for (int i = 1; i <= n; i++)
if (bo[i] && Point<int>::GetDistance(pt[p], pt[i]) <= d)
set.Union(p, i);
bo[p] = true;
} else {
scanf("%d%d", &p, &q);
puts(set.Find(p) == set.Find(q) ? "SUCCESS" : "FAIL");
}
}
return 0;
}