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
");
        }
    }
}
君子知命不惧,自当日日自新
原文地址:https://www.cnblogs.com/xuxiaojin/p/9406599.html