• 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
    ");
            }
        }
    }
    君子知命不惧,自当日日自新
  • 相关阅读:
    算法的力量
    图文细说11种计算机图标符号的历史
    位图像素的颜色
    位图像素的颜色
    大数处理之三(除法)
    大数处理之三(除法)
    大数处理之二(幂运算)
    大数处理之二(幂运算)
    浮点数(double)的优势
    大数处理之一(加法和乘法)
  • 原文地址:https://www.cnblogs.com/xuxiaojin/p/9406599.html
Copyright © 2020-2023  润新知