poj2236(并查集)

题目链接: http://poj.org/problem?id=2236

题意: 有n台计算机, 已知每台计算机的坐标, 初始时所有计算机都是坏的, 然后修复其中一些计算机, 已修复的计算机距离不超过distance的可以联网(若a, b之间可以联网, b, c之间可以联网, 则a, c之间可以联网),询问x, y之间可否联网;

第一行输入n, distance, 表示有n台计算机, 联网的两台计算机距离不能超过distance;

接下来n分别表示n台计算机的坐标;

再接下来到输入结束, 输入格式为: O, x 的表示修复第x台计算机, 输入格式为S, x, y 的表示询问x, y之间能否联网, 若能输出 SUCCESS, 不能则输出 FAIL;

思路: 直接并查集就好啦, 将能联网的计算机合并就OK啦...

代码:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <algorithm>
 4 #include <math.h>
 5 #define D(x1, y1, x2, y2) sqrt(pow(x2-x1, 2)+pow(y2-y1, 2))
 6 #define MAXN 1010
 7 using namespace std;
 8
 9 int pre[MAXN];
10 struct Node{
11     int x, y, flag;
12 }gg[MAXN];
13
14 int find(int x){  //***递归路径压缩
15     return x==pre[x]?pre[x]:pre[x]=find(pre[x]);
16 }
17
18 void jion(int x, int y){//***合并
19     int fx=find(x);
20     int fy=find(y);
21     if(fx!=fy){
22         pre[fy]=fx;
23     }
24 }
25
26 int main(void){
27     int n, distance;
28     scanf("%d%d", &n, &distance);
29     for(int i=1; i<=n; i++){
30         int x, y;
31         scanf("%d%d", &x, &y);
32         gg[i].x=x;
33         gg[i].y=y;
34         gg[i].flag=0;
35     }
36     for(int i=1; i<=n; i++){
37         pre[i]=i;
38     }
39     char ch[2];
40     int x, y;
41     while(~scanf("%s", ch)){
42         if(ch[0]==‘O‘){
43             scanf("%d", &x);
44             gg[x].flag=1;
45             for(int i=1; i<=n; i++){
46                 if(i!=x&&gg[i].flag){ //**如果i不是x且i已修复
47                     if(D(gg[x].x, gg[x].y, gg[i].x, gg[i].y)<=distance&&find(x)!=find(i)){ //**x, i属于不同集合,并且他们的距离不大于distance
48                         jion(x, i);
49                     }
50                 }
51             }
52         }else{
53             scanf("%d%d", &x, &y);
54             if(find(x)==find(y)){
55                 printf("SUCCESS\n");
56             }else{
57                 printf("FAIL\n");
58             }
59         }
60     }
61     return 0;
62 }
时间: 2024-08-14 18:35:25

poj2236(并查集)的相关文章

Wireless Network(POJ-2236)(并查集)

由于查询次数可能很多,相互关联的电脑也可能很多,而各个电脑之间的关系只有合并关系和查询,符合并查集的特点. 并查集更偏模板一点,没有什么思维难度,只要把握好需要使用并查集的条件就好了. #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<map> using namespace std; i

详解并查集

详解并查集  Powered by WSY in SSF    2019-11-02  13:46 [1]并查集的定义:   并查集(Disjoint  Set)是一种非常精巧的非常实用的数据结构,它主要用来处理一些不相交集合的合并问题,经典的例子有联通子图,最小生成树的克鲁斯-卡尔算法. [2]并查集的经典问题:   我们通常使用“帮派”.“团伙”等问题举例说明并查集.例如帮派问题: 在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,而且满足: 1. 我朋友的朋友是我的朋友: 2. 我敌

POJ2236 wireless network 【并查集水题】

前端开发whqet,csdn,王海庆,whqet,前端开发专家 今天是个好日子,2014年5月20日,表白的最佳时机,虽说孩子已经四岁.结婚已经五年,但是也不可以偷懒,于是有了这个效果. 在线研究点这里,下载收藏点这里.程序猿and程序媛,大胆秀出你的爱吧. 利用html5 canvas实现动态的文字粒子效果,效果如下. OK,简单看看原理,首先我们需要在canvas里面实现描边文字,然后利用getImageData获得描边文字的像素矩阵,将粒子效果绑定在描边文章上. 整个效果如下. html文

poj-2236 Wireless Network (基础并查集)

http://poj.org/problem?id=2236 由于发生了地震,有关组织组把一圈电脑一个无线网,但是由于余震的破坏,所有的电脑都被损坏,随着电脑一个个被修好,无线网也逐步恢复工作,但是由于硬件的限制,一台电脑和另一台电脑能够相连当他们之间的距离小于d,或者还有一台电脑当中介,分别与两台电脑相连. 在修复的过程中,工作者会有两种操作,修复电脑和询问电脑a和电脑b是否相连.当询问的时候输出答案. 因为输入数据很大,需要快速判断电脑a和电脑b相连,所以自然想到用并查集. 初始时候 全部电

poj2236 Wireless Network 并查集简单应用

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

并查集 poj2236

网址:http://poj.org/problem?id=2236 题意:有n台坏的电脑,如果每两台电脑的距离不能超过d,那么这两台电脑有联系,用字符串O 表示标记第x台电脑维修了,用S判断从X到y是否有联系... 题解:用并查集记录和查找每个点的父亲节点,每次输入的同时遍历该点和其他点是否有联系(即距离小于等于的)..... 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using name

poj2236(Wireless Network)并查集

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

并查集——poj2236(带权并查集)

题目:Wireless Network 题意:给定n台已损坏计算机的位置和计算机最远通信距离d,然后分别根据命令执行以下两种操作: "O p" (1 <= p <= N) :表示修理计算机p: "S p q" (1 <= p, q <= N) :表示检测计算机p和计算机q能否通信. 输出:能通信则输出"SUCCESS",否则输出"FAIL" 题解: 带权并查集还是那个重要的知识点--关系. 此题,我们使

poj2236 基础并查集

题目链接:http://poj.org/problem?id=2236 题目大意:城市网络由n台电脑组成,因地震全部瘫痪,现在进行修复,规定距离小于等于d的电脑修复之后是可以直接相连 进行若干操作,O a,修复编号为a的电脑,S a,b  询问a,b电脑能否联系 思路分析:并查集,只是和并条件变了,首先要已经被修复(vis数组)其次距离要小于d,并查集搞完之后 询问的时候只需要看他们是不是有着相同的根节点即可. 代码: #include <iostream> #include <cstd