代码:(我的)
#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
求助!!!!