POJ 2236 Wireless Network (并查集&用set进行优化)

http://poj.org/problem?id=2236


思路:用set保存已修好的电脑(使用set是为了去重),每次修电脑p时就把set中的与p距离<=d的电脑合并。


完整代码:

/*766ms,640KB*/

#include<cstdio>
#include<set>
using namespace std;

int x[1005], y[1005];
int fa[1005], rk[1005];
bool vis[1005];

int find(int x) {return fa[x] = (fa[x] == x ? x : find(fa[x]));}

void merge(int x, int y)
{
	x = find(x), y = find(y);
	if (x == y) return;
	if (rk[x] < rk[y]) fa[x] = y;
	else
	{
		fa[y] = x;
		if (rk[x] == rk[y]) ++rk[x];
	}
}

int main()
{
	int n, d, i, j, p, q;
	char ch;
	scanf("%d%d", &n, &d);
	d *= d;
	for (i = 1; i <= n; ++i) fa[i] = i;
	for (i = 1; i <= n; ++i) scanf("%d%d", &x[i], &y[i]);
	getchar();
	set<int> id;
	set<int>::iterator iter;
	while (~(ch = getchar()))
	{
		if (ch == 'O')
		{
			scanf("%d", &p);
			vis[p] = true;
			id.insert(p);
			for (iter = id.begin(); iter != id.end(); ++iter)
			{
				j = *iter;
				if (vis[j] && (x[p] - x[j]) * (x[p] - x[j]) + (y[p] - y[j]) * (y[p] - y[j]) <= d)
					merge(p, j);
			}
		}
		else
		{
			scanf("%d%d", &p, &q);
			puts(find(p) == find(q) ? "SUCCESS" : "FAIL");
		}
		getchar();
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值