想了半天写了一个搜索,不过里面用到了并查集的思想。。。结果很显然我TLE了6个点。
看了题解之后发现自己傻了。。所以就把搜索去掉,单用并查集解决不就完事儿了qaq
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cmath>
#define ll long long
using namespace std;
const int maxn=10100;
int t;
int n,tot,tot1;
int fa[maxn];
ll h,r;
struct node
{
ll x,y,z;
int id;
}a[maxn];
node start[maxn],end[maxn];
bool b[maxn];
long double dis(int i,int j)
{
ll x1=a[i].x-a[j].x;
ll y1=a[i].y-a[j].y;
ll z1=a[i].z-a[j].z;
return sqrt((long double)x1*x1+y1*y1+z1*z1);
}
int find(int x)
{
if(x!=fa[x]) fa[x]=find(fa[x]);
return fa[x];
}
void merge(int x,int y)
{
int f1=find(x);
int f2=find(y);
if(f1!=f2)
{
fa[f2]=f1;
}
}
int main()
{
freopen("cheese.in","r",stdin);
freopen("cheese.out","w",stdout);
scanf("%d",&t);
while(t--)
{
memset(a,0,sizeof(a));
memset(start,0,sizeof(start));
memset(end,0,sizeof(end));
scanf("%d %lld %lld",&n,&h,&r);
for(int i=1;i<=n;i++)
{
scanf("%lld %lld %lld",&a[i].x,&a[i].y,&a[i].z);
}
for(int i=1;i<=n;i++)
{
fa[i]=i;
}
for(int i=1;i<=n;i++)
{
int ans=0;
for(int j=1;j<=n;j++)
{
if(i==j) continue;
if(dis(i,j)<=2*r)
{
merge(i,j);
}
}
}
tot=0,tot1=0;
for(int i=1;i<=n;i++)
{
if(r-a[i].z>=0)
{
start[++tot].x=a[i].x;
start[tot].y=a[i].y;
start[tot].z=a[i].z;
start[tot].id=i;
}
}
for(int i=1;i<=n;i++)
{
if(a[i].z+r>=h)
{
end[++tot1].x=a[i].x;
end[tot1].y=a[i].y;
end[tot1].z=a[i].z;
end[tot1].id=i;
}
}
bool flag3=false;
for(int i=1;i<=tot;i++)
{
for(int j=1;j<=tot1;j++)
{
if(find(start[i].id)==find(end[j].id))
{
flag3=true;
break;
}
}
if(flag3==true) break;
}
if(flag3==true) printf("Yes\n");
else printf("No\n");
}
fclose(stdin);
fclose(stdout);
return 0;
}