(使用树结构来支持并查集操作8.4.2)POJ 2236 Wireless Network(判断两个元素是否在同一个集合&&有条件的合并)

/*
 * POJ_2236.cpp
 *
 *  Created on: 2013年11月5日
 *      Author: Administrator
 */

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int maxn = 1010;

int father[maxn];//用来维护父子关系,如father[a] = b 表示a的父亲是b
int x[maxn];
int y[maxn];
bool valid[maxn];//valid[i] = true ,表示某一个节点已经修复

//并查集的查询操作
int find(int a){
	if(father[a] == a){
		return a;
	}

	return (father[a] = find(father[a]));
}

//并查集的合并操作
void join(int p,int q){
	p = find(p);
	q = find(q);

	if(p != q){
		father[p] = q;
	}
}

int main(){
	int n,d;
	while(scanf("%d%d",&n,&d)!=EOF){
		memset(valid,false,sizeof(valid));

		int i;
		for(i = 1 ; i <= n ; ++i){
			father[i] = i;
		}

		for(i = 1 ; i <= n ; ++i){
			scanf("%d%d",&x[i],&y[i]);
		}

		char str[10];
		while(scanf("%s",str)!=EOF){
			if(str[0] == 'O'){
				int p;
				scanf("%d",&p);

				valid[p] = true;

				for(i = 1 ; i <= n ; ++i){//每修复一个节点,都尝试着将这个节点连入已经连好的网络之中
					if(valid[i] && ((x[i]-x[p])*(x[i]-x[p])+(y[i]-y[p])*(y[i]-y[p]) <= d*d) ){
						join(i,p);
					}
				}
			}else if(str[0] == 'S'){
				int a,b;
				scanf("%d%d",&a,&b);

				if(find(a) != find(b)){
					printf("FAIL\n");
				}else{
					printf("SUCCESS\n");
				}
			}
		}
	}

	return 0;
}




你可能感兴趣的:((使用树结构来支持并查集操作8.4.2)POJ 2236 Wireless Network(判断两个元素是否在同一个集合&&有条件的合并))