题面如下:
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