您的位置:首页 > 其它

POJ 2236 (简单并查集) Wireless Network

2014-09-07 10:04 435 查看
题意:

有n个电脑坏掉了,分别给出他们的坐标

有两种操作,可以O x表示修好第x台电脑,可以 S x y表示x y是否连通

两台电脑的距离不超过d便可连通,两台电脑是连通的可以直接连通也可以间接通过第三台电脑连通

思路:

每次修好一台电脑都和前面已经修好的电脑比较一下如果距离小于d而且不在同一网络,便合并在一起即可

//#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int maxn = 1000 + 10;
struct Pos
{
int x, y;
}pos[maxn];

int p[maxn], o[maxn];

int Find(int a)
{
return p[a] == a ? a : p[a] = Find(p[a]);
}

void Union(int a, int b)
{
int pa = Find(a);
int pb = Find(b);
if(pa != pb)
p[pa] = pb;
}

int main(void)
{
#ifdef LOCAL
freopen("2236in.txt", "r", stdin);
#endif

int n, d, a, b, cnt = 0;
char cmd[10];
scanf("%d%d", &n, &d);
for(int i = 0; i <= n; ++i)    p[i] = i;
memset(o, false, sizeof(o));
for(int i = 1; i <= n; ++i)
scanf("%d%d", &pos[i].x, &pos[i].y);
while(scanf("%s", cmd) != EOF)
{
if(cmd[0] == 'O')
{
scanf("%d", &a);
o[cnt++] = a;
for(int i = 0; i < cnt - 1; ++i)
{
if((pos[a].x-pos[o[i]].x)*(pos[a].x-pos[o[i]].x) + (pos[a].y-pos[o[i]].y)*(pos[a].y-pos[o[i]].y) <= d * d)
{
Union(a, o[i]);
}
}
}
else
{
scanf("%d%d", &a, &b);
if(Find(a) == Find(b))
puts("SUCCESS");
else
puts("FAIL");
}
}

return 0;
}


代码君
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: