首页 > 其他分享 >528. 奶酪(并查集orBFS)

528. 奶酪(并查集orBFS)

时间:2024-04-19 11:11:25浏览次数:28  
标签:return orBFS int 查集 long add include 528 find

题面如下:

https://www.acwing.com/problem/content/530/

大致思路是:合并所有连接的空洞,判断下表面的空洞和上表面的空洞是否是同一集合集合

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>

using namespace std;


const int N = 1e3+10;

int t;
long long p[N];
long long x[N],y[N],z[N];

int find(int x)
{  
    if(p[x]!=x)p[x]=find(p[x]);
    return p[x];
}

long long dist(int i,int j)
{
    return (x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])+(z[i]-z[j])*(z[i]-z[j]);
}

bool same(int a,int b)
{
    return find(a)==find(b);
}

void add(int a,int b)
{
    p[find(b)]=find(a);
}


int main()
{
    cin >> t;
    while(t--)
    {
        long long n,h,r;
        cin >> n >> h >> r;
        for(int i=1;i<=n;i++)cin >> x[i] >> y[i] >> z[i];
        for(int i=0;i<=n+1;i++)p[i]=i;
        for(int i=1;i<=n;i++)
            for(int j=i+1;j<=n;j++)
            {
                if(4*r*r>=dist(i,j))
                {
                    // 此时相交或相切,加入到同集合中
                    add(i,j);
                }
            }
        for(int i=1;i<=n;i++)
            if(z[i] - r <= 0)add(0,i);

        for(int i=1;i<=n;i++)
            if(z[i] + r >= h)add(n+1,i);
            
        if(same(0,n+1))cout<<"Yes\n";else cout<<"No\n";
    }
}

 

标签:return,orBFS,int,查集,long,add,include,528,find
From: https://www.cnblogs.com/lxl-233/p/18145379

相关文章

  • 倍增并查集
    如果你既会倍增,又会并查集,那你一定会倍增并查集吧!link数据范围明示\(O(n^2)\)无法通过。众所周知,倍增是\(O(\logn)\)的,并查集近似\(O(n)\)的,它们结合一下不就能过了吗?先来重新考虑一下倍增的本质。倍增倍增最经典的用法是ST表。我们将一个区间拆成两个长为\(2^k\)......
  • 928. 尽量减少恶意软件的传播 II【并查集加暴力删边判断】
    题意不是很清晰:1.比如对于graph=[[1,1,0],[1,1,1],[0,1,1]],initial=[0,1]来说,可以发现结点的链接情况是0-1-2,感染源结点是0和1,若是按之前题目的要求,移除0和1都不会减少最终感染个数,但是应该返回结点0,因为其index小。但是应用此题的条件,就一定要返回结点1,因为移除结点1之......
  • P3295 [SCOI2016] 萌萌哒(倍增并查集)
    题意简述有一个长为\(n\)的数字序列\(s\),有\(q\)组限制\(l_1,r_1,l_2,r_2\)形如\(s_{l_1,\cdots,r_1}=s_{l_2\cdots,r_2}\),求满足所有限制的\(s\)的方案数,数字序列不能有前导0。\(n,q\le10^5\),保证\([l_1,r_1]\)和\([l_2,r_2]\)大小相等。分析字符之间的等量......
  • 2019年蓝桥杯省赛-修改数组(并查集)
    0.题目时间限制:1.0s内存限制:256.0MB本题总分:20分【问题描述】给定一个长度为N的数组A=[A1,A2,···AN],数组中有可能有重复出现的整数。现在小明要按以下方法将其修改为没有重复整数的数组。小明会依次修改A2,A3,···,AN。当修改Ai时,小明会检查......
  • 蓝桥杯-并查集-合根植物
    0.题目1.解析1.1并查集思路主要三大模板功能1.初始化(init)2.寻找父节点(find)3.合并(merge)我们在find中可以使用路径压缩简化运算,缩短运行时间而启发式合并则可以将运行时间压缩,由O(n)到o(logn)代码#include<bits/stdc++.h>usingnamespacestd;constintMaxn......
  • 并查集
    介绍并查集主要用于处理一些不相交集合的合并问题,一些常见的用途有求联通子图,求最小生成树的Kruskal算法和求最近公共祖先等。并查集的基本操作主要有:初始化查询合并操作初始化假设有编号为1,2,3……,n的n个元素,我们用一个数组fa[]来储存每个元素的父节点。一开始,我们先将......
  • 【学习笔记】并查集
    一、普通并查集1.定义&作用并查集是管理元素分组的算法,可以高效对元素分组(合并为一组)以及查询两个元素是否在一组。2.主要思想&实现对于每一个组,设置一个“组长”,每一次合并时只需要将其中一组的组长设为另一组的组长,查询时只需要查询组长是否相同。每一个组都可以理解......
  • 【数据结构 | 并查集】维护元素分组信息,支持高效合并集合、查询元素所在集合
    文章目录并查集概述引入并查集的实现存储方式Union-Find抽象基类两种实现思路基本实现基于QuickFind思路基于QuickUnion思路优化基于size的优化基于rank的优化find优化路径压缩路径分裂路径减半总结并查集概述并查集(DisjointSetUnion,简称并查集),也叫......
  • CF455C. Civilization-并查集
    2100分的并查集(x)link:https://codeforces.com/contest/455/problem/C给一张无向森林,有若干次操作,有两种:询问\(x\)所在树的直径合并\(x,y\)所在的连通块,使得合并后的直径最小\(n,m,q\leq3\times10^5\)处理出每个连通块的直径,考虑如何合并两个连通块?设原来的直径分别......
  • 并查集(水题)
    A.是不是亲戚题目描述若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。规定:x 和 y 是亲戚,y 和 z 是亲戚,那么 x 和 z 也是亲戚。如果 x,y 是亲戚,那么 x 的亲戚都是 y 的亲戚,y 的亲戚......