代码:(我的)
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
struct node{
int u,v;
double w;
}e[10000005];
int x[1000005],y[1000005],z[1000005],fa[100005],num=0;
int t,n,h,r;
double cal(int a,int b){
return sqrt((long long)((long long)(x[a]-x[b])*(x[a]-x[b])+(long long)(y[a]-y[b])*(y[a]-y[b])+(long long)(z[a]-z[b])*(z[a]-z[b])));
}
int find(int a){
if(a==fa[a])
return a;
return a=fa[a];
}
int cmp(node a,node b){
return a.w<b.w;
}
int main(){
cin>>t;
while(t--){
num=0;
memset(x,0,sizeof(x));
memset(y,0,sizeof(y));
memset(z,0,sizeof(z));
memset(e,0,sizeof(e));
cin>>n>>h>>r;
for(int i=0;i<=n;i++)
fa[i]=i;
for(int i=1;i<=n;i++)
cin>>x[i]>>y[i]>>z[i],fa[i]=i;
fa[n+1]=n+1;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
e[++num].u=i,e[num].v=j,e[num].w=cal(i,j)/2;
for(int i=1;i<=n;i++){
e[++num].u=i,e[num].v=0,e[num].w=z[i];
e[++num].u=0,e[num].v=i,e[num].w=z[i];
e[++num].u=i,e[num].v=n+1,e[num].w=h-z[i];
e[++num].u=n+1,e[num].v=i,e[num].w=h-z[i];
}
sort(e+1,e+num+1,cmp);
bool flag=false;
for(int i=1;i<=num;i++){
if(e[i].w>r)
break;
int a=e[i].u,b=e[i].v;
if(find(a)!=find(b))
fa[find(a)]=find(b);
if(find(0)==find(n+1)){
flag=true;
break;
}
}
if(flag==true)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}
30分,能通过样例。剩下的1个WA,然后全部TLE
hack的一组数据:
(T不给出)
8 5581 3224
-5586 -4382 407
4 -8416 0 4315
840 -3792 142
-7214 -7830 5162
6112 9150 4125
2400 848 1298
-3604 2463 1637
9476 8708 660
答案输出:Yes
我的输出:No
求助!!!!