poj 2236 网络连接问题 并查集

题意:n台电脑,当两台之间的距离小于d的时候可以连接。 题目会进行操作“修复”还有“查询是否已经连接”。只要在查询的时候输出YES或者ON

思路:

  1. 把可以相互连接的 即两者之间的距离小于 d  q[i].push_back(j) 还有 q[j].push_back(i)  这里面的q为动态数组 q[i]存储的是可以与i相连的机器
  2. 每台机器的初始根节点为i
  3. 修复操作的时候,进行更改根节点,如果i,j都已经被修复了,那么i j就可以连到同一个根节点上面
  4. 查询操作的时候,如果两者都在同一个根节点,就说明连接成功,否则连接失败

解决问题的代码:

#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <string.h>
using namespace std;
const int N = 1009;
int x[N], y[N], fa[N];
bool p[N];
vector<int> v[N];
int Find(int x)
{
    if (fa[x] == x) return x;
    return fa[x] = Find(fa[x]);
}
int main()
{
    int n, d;
    char s[2];
    memset(p, 0, sizeof(p));
    scanf("%d%d", &n, &d);
    for (int i = 1; i <= n; i++)
    {
        scanf("%d%d", &x[i], &y[i]);
        fa[i] = i;
    }
    for (int i = 1; i <= n; i++)
        for (int j = i + 1; j <= n; j++)
            if (((x[i] - x[j])*(x[i] - x[j]) + (y[i] - y[j])*(y[i] - y[j])) <= d * d)
            {
                v[i].push_back(j); v[j].push_back(i);
            }
    while (~scanf("%s", s))
    {
        int a, b;
        if (s[0] == ‘0‘)
        {
            scanf("%d", &a);
            p[a] = true;
            for (int i = 0; i < v[i].size(); i++)
            {
                if (p[v[a][i]])
                {
                    b = Find(v[a][i]);
                    fa[b] = a;
                }
            }
        }
        else
        {
            scanf("%d%d", &a, &b);
            int dx = Find(a);
            int dy = Find(b);
            if (dx == dy)
                printf("SUCCESS\n");
            else printf("FAIL\n");
        }
    }
}

原文地址:https://www.cnblogs.com/xuxiaojin/p/9406599.html

时间: 2024-10-10 07:46:42

poj 2236 网络连接问题 并查集的相关文章

poj 2236:Wireless Network(并查集,提高题)

Wireless Network Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 16065   Accepted: 6778 Description An earthquake takes place in Southeast Asia. The ACM (Asia Cooperated Medical team) have set up a wireless network with the lap computer

poj 2236 Wireless Network(并查集)

题目大意: 给你N台电脑,从1-N.一个数字,表示两台计算机的最大通信距离,超过这个距离就无法进行通信.然后分别告诉这些电脑的坐标,接下来有两种操作,第一种O表示这点电脑修好,第二种S,表示测试这两台电脑能不能进行正常的通信   解题思路: 并查集的简单应用,对每次修好的电脑对其它已经修好的电脑遍历,如果距离小于等于最大通信距离就将他们合并.之后判断2台电脑是不是一个集合中就KO了 1 #pragma comment(linker, "/STACK:1024000000,1024000000&q

POJ - 2236 Wireless Network (并查集)

https://cn.vjudge.net/problem/POJ-2236 题意 有一个计算机网络的所有线路都坏了,网络中有n台计算机,现在你可以做两种操作,修理(O)和检测两台计算机是否连通(S),只有修理好的计算机才能连通.连通有个规则,两台计算机的距离不能超过给定的最大距离D(一开始会给你n台计算机的坐标).检测的时候输出两台计算机是否能连通. 分析 注意审题..只有修理好的才能算联通.于是把所有修理好的并一起就行了. #include <iostream> #include <

poj 2236 Wireless Network 【并查集】

Wireless Network Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 16832   Accepted: 7068 Description An earthquake takes place in Southeast Asia. The ACM (Asia Cooperated Medical team) have set up a wireless network with the lap computer

POJ 1611 The Suspects(并查集)

The Suspects Time Limit: 1000MS   Memory Limit: 20000K Total Submissions: 22296   Accepted: 10842 Description Severe acute respiratory syndrome (SARS), an atypical pneumonia of unknown aetiology, was recognized as a global threat in mid-March 2003. T

POJ 2263 Heavy Cargo(二分+并查集)

题目地址:POJ 2263 这题是在网上的一篇关于优先队列的博文中看到的..但是实在没看出跟优先队列有什么关系..我用的二分+并查集做出来了... 二分路的载重量.然后用并查集检查是否连通. 代码如下: #include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <ctype.h> #

POJ 2528 Mayor&#39;s posters 并查集+离散化做法

Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 49767 Accepted: 14434 Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign have been placing their electoral posters

poj 2524:Ubiquitous Religions(并查集,入门题)

Ubiquitous Religions Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 23997   Accepted: 11807 Description There are so many different religions in the world today that it is difficult to keep track of them all. You are interested in findi

poj 2492A Bug&#39;s Life(并查集)

1 /* 2 目大意:输入一个数t,表示测试组数.然后每组第一行两个数字n,m,n表示有n只昆虫,编号从1—n,m表示下面要输入m行交配情况,每行两个整数,表示这两个编号的昆虫为异性,要交配. 3 要求统计交配过程中是否出现冲突,即是否有两个同性的昆虫发生交配. 4 5 思路:并查集 6 将同性的昆虫放入集合之中,如果输入的昆虫u, v同时出现在了集合中,那么 u,v就是同性的!发生了同性交配的可能! 7 */ 8 9 #include <string> 10 #include <cst