并查集40pts求助,悬赏3关注
查看原帖
并查集40pts求助,悬赏3关注
565890
封禁用户楼主2023/8/8 17:47

代码:

#include<bits/stdc++.h>
using namespace std;
int t;
struct shape{
	double x,y,z;
	bool flag;
}a[1000005];
int f[1000005];
double dist(int p1,int p2){
	return sqrt((a[p1].x-a[p2].x)*(a[p1].x-a[p2].x)+(a[p1].y-a[p2].y)*(a[p1].y-a[p2].y)+(a[p1].z-a[p2].z)*(a[p1].z-a[p2].z))*1.0000000;
}
int find(int x){
	if(x==f[x]) return x;
	return f[x]=find(f[x]);
}
signed main(){
	cin>>t;
	while(t--){
		memset(f,0,sizeof(f));
		memset(a,0,sizeof(a));
		double n,h,r;
		cin>>n>>h>>r;
		for(int i=1;i<=n;i++){
			f[i]=i;
		}
		for(int i=1;i<=n;i++){
			cin>>a[i].x>>a[i].y>>a[i].z;
			if(a[i].z<=r&&a[i].z>=0-r) a[i].flag=1; //这里判断这个洞是否与下表面相交或相切
			for(int j=1;j<i;j++){
				double num=dist(i,j);
				if(num<=2*r){
					int x=find(i); 
					int y=find(j);
					if(a[i].z>=a[j].z) f[y]=x;
					else f[x]=y;
				}
			}
		}
		bool ans=0;
		for(int i=1;i<=n;i++){
			if(a[i].flag){
				if(a[find(f[i])].z>=h-r){
					cout<<"Yes\n";
					ans=1;
					break;
				}
			}
		}
		if(ans==0) cout<<"No\n";
	}
	
    return 0;
}

2023/8/8 17:47
加载中...