poj2236(并查集)

题意:

图上有n个坏掉的电脑;

如果两台电脑都是好的,并且距离小于d则可以通信,当然不需要直接通信也可以,可以通过中间一台好的电脑通信;

O a表示修好了电脑a

S a b问a,b能不能通信;


思路:

每次修好一台电脑,都和所有其他已经修好的电脑比较距离,如果小于d,和那台电脑并起来;


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

const int N = 1005;
int p[N],x[N],y[N],repair[N],n,cnt;
double d;
char c;
void init(int a) {
	for(int i = 0; i <= a; i++)
		p[i] = i;
}
double cul(int a,int b) {
	return 	sqrt(1.0*(x[a]-x[b]) * (x[a]-x[b]) + 1.0*(y[a]-y[b])*(y[a] - y[b]));
}
int find_p(int a) {
	return a == p[a] ? a : p[a] = find_p(p[a]);
}
void Union(int a,int b) {
	int px = find_p(a);
	int py = find_p(b);
	if(px != py)
		p[px] = py;
}
int main() {
	scanf("%d%lf",&n,&d);
	for(int i = 0; i < n; i++) {
		scanf("%d%d",&x[i],&y[i]);
	}
	init(n);
	int a,b;
	cnt = 0;
	getchar();
	while(scanf("%c%d",&c,&a) != EOF) {
		if(c == 'O') {
			for(int i = 0; i < cnt; i++) {
				if(cul(a - 1,repair[i]) <= d)
					Union(a - 1,repair[i]);
			}
			repair[cnt++] = a - 1;
		}
		if(c == 'S') {
			scanf("%d",&b);
			if(find_p(a - 1) == find_p(b - 1))
				printf("SUCCESS\n");
			else
				printf("FAIL\n");
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值