您的位置:首页 > 其它

POJ 2236 Wireless Network

2016-03-23 14:34 495 查看
#include <cstdio>
#include <iostream>

using namespace std;
const int MAX = 1e3 + 5;
int x[MAX], y[MAX], fa[MAX], flag[MAX], r[MAX];
int n, d;

void init(int n)
{
for (int i = 1; i <= n; ++i)
{
fa[i] = i;
flag[i] = 0;
r[i] = 1;
}
}
int find(int x)
{
return fa[x] == x ? x : fa[x] = find(fa[x]);
}

void unite(int a, int b)
{
int t_a = a;
int t_b = b;
a = find(a);
b = find(b);
if (a == b)
return ;
if ((x[t_a] - x[t_b]) * (x[t_a] - x[t_b]) + (y[t_a] - y[t_b]) * (y[t_a] - y[t_b]) <= d * d && r[a] < r[b])
{
fa[a] = b;
}
else if ((x[t_a] - x[t_b]) * (x[t_a] - x[t_b]) + (y[t_a] - y[t_b]) * (y[t_a] - y[t_b]) <= d * d && r[a] >= r[b])
{
fa[b] = a;
if (r[b] == r[a])
r[b]++;
}

}

int main()
{
scanf("%d%d", &n, &d);
init(n);
for (int i = 1; i <= n; ++i)
{
scanf("%d%d", &x[i], &y[i]);
}
char type;
while (scanf(" %c", &type)!= EOF)//为了" %c"吞掉前面的回车
{
if (type == 'O')
{
int id;
scanf("%d", &id);
flag[id] = 1;
for (int i = 1; i <= n; ++i)
{
if (flag[i] && i != id)
{
unite(i, id);
}
}
}
else if (type == 'S')
{
int id1, id2;
scanf("%d%d", &id1, &id2);
if (find(id1) == find(id2))
printf("SUCCESS\n");
else
printf("FAIL\n");
}
}

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