Wireless Network

Time Limit: 10000MS   Memory Limit: 65536K
Total Submissions: 43199   Accepted: 17800

Description

An earthquake takes place in Southeast Asia. The ACM (Asia Cooperated Medical team) have set up a wireless network with the lap computers, but an unexpected aftershock attacked, all computers in the network were all broken. The computers are repaired one by one, and the network gradually began to work again. Because of the hardware restricts, each computer can only directly communicate with the computers that are not farther than d meters from it. But every computer can be regarded as the intermediary of the communication between two other computers, that is to say computer A and computer B can communicate if computer A and computer B can communicate directly or there is a computer C that can communicate with both A and B.

In the process of repairing the network, workers can take two kinds of operations at every moment, repairing a computer, or testing if two computers can communicate. Your job is to answer all the testing operations.

Input

The first line contains two integers N and d (1 <= N <= 1001, 0 <= d <= 20000). Here N is the number of computers, which are numbered from 1 to N, and D is the maximum distance two computers can communicate directly. In the next N lines, each contains two integers xi, yi (0 <= xi, yi <= 10000), which is the coordinate of N computers. From the (N+1)-th line to the end of input, there are operations, which are carried out one by one. Each line contains an operation in one of following two formats: 
1. "O p" (1 <= p <= N), which means repairing computer p. 
2. "S p q" (1 <= p, q <= N), which means testing whether computer p and q can communicate.

The input will not exceed 300000 lines.

Output

For each Testing operation, print "SUCCESS" if the two computers can communicate, or "FAIL" if not.

Sample Input

4 1
0 1
0 2
0 3
0 4
O 1
O 2
O 4
S 1 4
O 3
S 1 4

Sample Output

FAIL
SUCCESS

Source

 
本题思路:存储每个被维修的电脑,对于每台被维修的电脑,我们只需要判断他和已经修复的电脑之间可不可以通信,如果可以则将它们加入一个集合。判断两台电脑是否可以通信只需要判断他们是否在一个集合中,很简单的并查集基本操作。
 
参考代码:
 #include <cstdio>
#include <cmath>
using namespace std; const int maxn = + ;
struct coordinate {
int x, y;
} G[maxn];
int n, d, p, q, cnt, head[maxn], Rank[maxn];
int isrepair[maxn];
char operation; double dis(int u, int v) {
return sqrt((double)(G[u].x - G[v].x) * (G[u].x - G[v].x) + (G[u].y - G[v].y) * (G[u].y - G[v].y));
} int find(int x) {
if(head[x] == x) return x;
return head[x] = find(head[x]);
} void Union_set(int x, int y) {
int dx = find(x), dy = find(y);
if(dx == dy) return;
if(Rank[dx] > Rank[dy]) head[dx] = dy;
else {
head[dy] = dx;
if(Rank[dx] == Rank[dy])
Rank[dx] ++;
}
} bool Is_same(int u, int v) {
return find(u) == find(v);
} int main () {
cnt = ;
scanf("%d %d", &n, &d);
for(int i = ; i <= n; i ++)
scanf("%d %d", &G[i].x, &G[i].y);
for(int i = ; i <= n; i ++) {
head[i] = i;
Rank[i] = ;
}
while(~scanf("%c", &operation)) {
if(operation == 'O') {
scanf("%d", &p);
for(int i = ; i <= cnt; i ++) {
if(dis(p, isrepair[i]) <= d) {
Union_set(isrepair[i], p);
}
}
isrepair[cnt ++] = p;
}
else if(operation == 'S') {
scanf("%d %d", &p, &q);
if(Is_same(p, q))
printf("SUCCESS\n");
else
printf("FAIL\n");
}
}
return ;
}

POJ-2236.WireleseNetwork.(并查集)的更多相关文章

  1. poj 2236【并查集】

    poj 2236 Description An earthquake takes place in Southeast Asia. The ACM (Asia Cooperated Medical t ...

  2. Poj(2236),简单并查集

    题目链接:http://poj.org/problem?id=2236 思路很简单,傻逼的我输出写成了FALL,然后遍历的时候for循环写错了,还好很快我就Debug出来了. #include < ...

  3. POJ 2236 (简单并查集) Wireless Network

    题意: 有n个电脑坏掉了,分别给出他们的坐标 有两种操作,可以O x表示修好第x台电脑,可以 S x y表示x y是否连通 两台电脑的距离不超过d便可连通,两台电脑是连通的可以直接连通也可以间接通过第 ...

  4. poj 2524 (并查集)

    http://poj.org/problem?id=2524 题意:在一所学校里面的人,都有宗教信仰,不过他们的宗教信仰有可能相同有可能不同,但你又不能直接去问他们,但你可以问他们和谁是同一个宗教.通 ...

  5. [POJ 2588]--Snakes(并查集)

    题目链接:http://poj.org/problem?id=2588 Snakes Time Limit: 1000MS   Memory Limit: 65536K   Description B ...

  6. poj 1456 Supermarket - 并查集 - 贪心

    题目传送门 传送点I 传送点II 题目大意 有$n$个商品可以销售.每个商品销售会获得一个利润,但也有一个时间限制.每个商品需要1天的时间销售,一天也只能销售一件商品.问最大获利. 考虑将出售每个物品 ...

  7. poj 2492(关系并查集) 同性恋

    题目;http://poj.org/problem?id=2492 卧槽很前卫的题意啊,感觉节操都碎了, t组测试数据,然后n,m,n条虫子,然后m行,每行两个数代表a和b有性行为(默认既然能这样就代 ...

  8. poj 1182 (关系并查集) 食物链

    题目传送门:http://poj.org/problem?id=1182 这是一道关系型并查集的题,对于每个动物来说,只有三种情况:同类,吃与被吃: 所以可以用0,1,2三个数字代表三种情况,在使用并 ...

  9. Poj(1182),种类并查集

    题目链接:http://poj.org/problem?id=1182 再次熟练种类并查集,又积累点经验,和技巧,rank 0 2 1 先计算father[x] ,再更新rank[x]; #inclu ...

随机推荐

  1. C语言排序算法学习笔记——选择类排序

    选择排序:每一趟(例如第i趟)在后面n-i+1(i=1,2,3,……,n-1)个待排序元素中选取关键字最小的元素,作为有序子序列的第i个元素,直到n-1趟做完,待排序元素只剩下1个,就不用再选了. 简 ...

  2. 【转】Lombok 安装、入门 - 消除冗长的 java 代码

    前言:    逛开源社区的时候无意发现的,用了一段时间,觉得还可以,特此推荐一下.    lombok 提供了简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 java 代码.特别是相对于 ...

  3. 团队第七次 # scrum meeting

    github 本此会议项目由PM召开,召开时间为4-11日晚上9点,以大家在群里讨论为主 召开时长10分钟 任务表格 袁勤 负责协调前后端 https://github.com/buaa-2016/p ...

  4. 代码:PC CSS(工作中用)

    常规内容区域的:标题和文字 2016-5-23 .p16{font-size:16px;color:#333;}/* 16号#333的标题 */ .p12-gray{font-size:16px;co ...

  5. python爬取免费优质IP归属地查询接口

    python爬取免费优质IP归属地查询接口 具体不表,我今天要做的工作就是: 需要将数据库中大量ip查询出起归属地 刚开始感觉好简单啊,毕竟只需要从百度找个免费接口然后来个python脚本跑一晚上就o ...

  6. nginx功能扩展整理

    0.基本负载均衡配置 编辑/etc/nginx/nginx.conf,加入负载平衡配置: http { upstream tomcat { server localhost:8080; server ...

  7. Windows下android模拟器环境搭建

      一.搭建java环境 1.下载jdk1.6.0_45 下载地址:http://www.oracle.com/technetwork/java/archive-139210.html ----> ...

  8. python———day02

    算术运算符 >>>1+2 3 >>>3-2 1 >>>2*2 4 >>>5/2 2.5 >>>5//2 #整除 ...

  9. 彻底搞懂Scrapy的中间件(一)

    中间件是Scrapy里面的一个核心概念.使用中间件可以在爬虫的请求发起之前或者请求返回之后对数据进行定制化修改,从而开发出适应不同情况的爬虫. "中间件"这个中文名字和前面章节讲到 ...

  10. 如何用jquery获取form表单的值

    $(function(){ $('.btn').click(function(){ alert($('#form').serialize()); }) }) 这样就获取到了 #form的值.