poj 2236 网络连接问题 并查集

Posted xuxiaojin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
");
            else printf("FAIL
");
        }
    }
}

 

以上是关于poj 2236 网络连接问题 并查集的主要内容,如果未能解决你的问题,请参考以下文章

POJ - 2236Wireless Network (并查集)

并查集 poj2236

poj 2236并查集

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

poj2236 (并查集)

POJ-2236(并查集)