528. 奶酪(并查集orBFS)

题面如下:

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";
    }
}

 

posted @ 2024-04-19 11:05  风乐  阅读(10)  评论(0)    收藏  举报