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

由于查询次数可能很多,相互关联的电脑也可能很多,而各个电脑之间的关系只有合并关系和查询,符合并查集的特点。

并查集更偏模板一点,没有什么思维难度,只要把握好需要使用并查集的条件就好了。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
using namespace std;
int n,d,vis[1111],rankk[1010],par[1020];
struct point {
    int x,y;
    point(int x = 0,int y = 0) : x(x),y(y) {}
    bool operator < (const point& r) const { return x<r.x || x==r.x && y<r.y; }
} a[1111];
void init(int n) {
    for(int i=1;i<=n;i++) {
        par[i] = i;
        rankk[i] = 0;
    }
}
int findd(int x) {
    return par[x]==x ? x : par[x] = findd(par[x]);
}
void unite(int x,int y) {
    x = findd(x);
    y = findd(y);
    if(x==y) return ;
    if(rankk[x]<rankk[y]) {
        par[x] = y;
    } else {
        par[y] = x;
        if(rankk[x] == rankk[y]) rankk[x]++;
    }
}
bool same(int x,int y) {
    return findd(x) == findd(y);
}
int main() {
    memset(vis,0,sizeof(vis));
    scanf("%d%d",&n,&d);
    for(int i=1;i<=n;i++) {
        scanf("%d%d",&a[i].x,&a[i].y);
    }
    char s[10];
    init(n);
    int b,c;
    while(scanf("%s",s)!=EOF) {
        if(s[0]=='O') {
            scanf("%d",&b);
            vis[b] = 1;
            for(int i=1;i<=n;i++) {
                if(vis[i]&&i!=b) {
                    int dd = (a[i].x-a[b].x)*(a[i].x-a[b].x)+(a[i].y-a[b].y)*(a[i].y-a[b].y);
                    if(dd<=(d*d)) unite(b,i);
                }
            }
        }
        else {
            scanf("%d%d",&b,&c);
            if(same(b,c)) printf("SUCCESS\n");
            else printf("FAIL\n");
        }
    }
    return 0;
}
时间: 2024-08-03 09:01:33

Wireless Network(POJ-2236)(并查集)的相关文章

Wireless Network (poj 2236 并查集)

Language: Default Wireless Network Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 17602   Accepted: 7418 Description An earthquake takes place in Southeast Asia. The ACM (Asia Cooperated Medical team) have set up a wireless network wit

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

Wireless Network Time Limit: 10000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Submit Status Description An earthquake takes place in Southeast Asia. The ACM (Asia Cooperated Medical team) have set up a wireless network with the lap co

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

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

A - Wireless Network POJ - 2236

题目大意:有n台坏掉的电脑,给出每台电脑的坐标,然后每次询问输入0(字符) x,表示电脑x恢复正常,输入S x y 询问x和y是否可以联网.只要是x和y的距离小于距离d,那么就可以联网,如果有个中介c使得x到c的距离小于d,y到c的距离小于d,那么x和y也可以联网. 题解:当修复好一台电脑后,然后判断与之前修好的电脑的距离,小于d的话,用并查集连在一起.(没敢这样想,感觉这样会T....) #include<cstdio> #include<iostream> #include&l

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

链接: http://poj.org/problem?id=2236 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82830#problem/A 代码: #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<algorithm> #include<iostream>

Wireless Network POJ 2236

http://poj.org/problem?id=2236 题意:现有一些电脑(编号从 1 - N),在修理好某台电脑并且当这台电脑与其他电脑距离不超过 D 的情况下, 其他电脑可以由这台电脑控制.       有两种操作:一是修理编号为 x 的某台电脑, 而是询问你编号从 p - q 的电脑是否都彼此联通 #include <iostream> #include <cstdio> #include <cmath> #include <algorithm>

poj 2236(并查集)

题意:有n个电脑坏了,编号从1到n,现在要修电脑且使电脑间能够通信,如果两台修好的电脑之间直接距离小于等于d就可以通信,如果电脑a和电脑c的距离大于d但a和c都可以与电脑b通信,那么a和c就可以通信了.O a,修好电脑a.S a b询问a和b是否能通信. 题解:每修好一台电脑,就过一遍所有电脑,把修好且能通信的电脑放到一个集合里,询问时只要判断是否在集合内就行了. #include <stdio.h> #include <math.h> const int N = 1005; st

F - Wireless Network 暴力更新+并查集

#include <cstdio> #include <iostream> #include <cmath> #include <cstdlib> #include <cstring> #define _for(i,a,b) for(int i= a;i<b;i++) using namespace std; const int N = 1e3+5; typedef long long ll; int flag[N],f[N]; int n

A - Wireless Network POJ - 2236-kuangbin带你飞

A - Wireless Network POJ - 2236 Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 50348   Accepted: 20619 Description An earthquake takes place in Southeast Asia. The ACM (Asia Cooperated Medical team) have set up a wireless network with

POJ 2236 Wireless Network ||POJ 1703 Find them, Catch them 并查集

POJ 2236 Wireless Network http://poj.org/problem?id=2236 题目大意: 给你N台损坏的电脑坐标,这些电脑只能与不超过距离d的电脑通信,但如果x和y均能C通信,则x和y可以通信.现在给出若干个操作, O p 代表修复编号为p的电脑 S p q代表询问p和q是不是能通信. 思路: 并查集即可.. 如果修复了一台电脑,则把与它相连距离不超过d的且修复了的放在一个集合里面. #include<cstdio> #include<cstring&