您的位置:首页 > 其它

POJ-2236-Wireless Network [并查集]

2017-07-25 08:54 323 查看
题目传送门

题意:

一个地图上分布着N台电脑,并给出N台电脑的坐标,如果两者之间距离小于等于d就可以通信,可以间接通信。

给出操作”O x”为修好x, 操作”S x y”为询问x y是否可以通信。输出”FAIL”或”SUCCESS”

思路:

如果输入”O x”就枚举所有已经出现过的点,判断两点之间距离是否小于等于d,如果小于等于d,就将这两个点合并。

如果输入”S x y”就求x y的父节点,相同即成功,不同即失败。

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;

struct node{
int x,y;
}Point[1200];
int vis[1200];
int Father[1200];
int n,d;
void init()
{
for (int i = 0; i < 1200; i++)
{
Father[i] = i;
}
memset(vis,0,sizeof(vis));
}
int Find(int x)
{
while (Father[x]!=x)
x = Father[x];
return x;
}
bool Dis(int a, int b)
{
int p = Point[a].x - Point[b].x;
int q = Point[a].y - Point[b].y;
if (p*p+q*q<=d*d)
return true;
return false;
}
int main(void)
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
scanf("%d %d", &n, &d);
init();
for (int i = 1; i <= n; i++)
scanf("%d %d", &Point[i].x, &Point[i].y);
char ch;
while (cin>>ch)
{
if (ch=='O')
{
int r;
scanf("%d", &r);
vis[r] = 1;
for (int i = 1; i <= n; i++)
{
if (i!=r && vis[i] && Dis(i,r))
{
int p = Find(i);
int q = Find(r);
Father[p] = q;
}
}
}
else
{
int r1,r2;
scanf("%d %d", &r1, &r2);
if (Find(r1)==Find(r2))
printf("SUCCESS\n");
else
printf("FAIL\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: