都快要和题解一模一样了。。。
#define R 1001
#include<bits/stdc++.h>
using namespace std;
int T,n,h,r,fa[R],x[R],y[R],z[R];
double dist(double ax,double ay,double az,double bx,double by,double bz)
{
return (double)(sqrt((double)(ax-bx)*(ax-bx)+(double)(ay-by)*(ay-by)+(double)(az-bz)*(az-bz)));
}
int find(int s)
{
int t,k=s;
while(k!=fa[k]) k=fa[k];
while(s!=fa[s])
{
t=s;
s=fa[s];
fa[t]=k;
}
return k;
}
int main()
{
cin>>T;
while(T--)
{
cin>>n>>h>>r;
for(int i=0;i<=n+1;i++) fa[i]=i;
for(int i=1;i<=n;i++)
{
cin>>x[i]>>y[i]>>z[i];
if(z[i]-r<=0)//合并底层
{
if(find(i)!=find(0))
fa[find(i)]=find(0);
}
if(z[i]+r>=h)//合并顶层
{
if(find(i)!=find(n+1))
fa[find(i)]=find(n+1);
}
for(int j=1;j<i;j++)//合并里面
{
if(2*r>=dist(x[i],y[i],z[i],x[j],y[j],z[j]))
{
if(find(i)!=find(j))
fa[find(i)]=find(j);
}
}
}
if(find(0)==find(n+1)) cout<<"Yes\n";
else cout<<"No\n";
}
return 0;
}