#2750 奶酪
描述
输入
每个输入文件包含多组数据。
输入文件的第一行,包含一个正整数 T,代表该输入文件中所含的数据组数。
接下来是 T 组数据,每组数据的格式如下:
第一行包含三个正整数 n, h 和 r, 两个数之间以一个空格分开,分别代表奶酪中空 洞的数量,奶酪的高度和空洞的半径。
接下来的 n 行,每行包含三个整数 x、 y、 z, 两个数之间以一个空格分开, 表示空 洞球心坐标为(x, y, z)。
输出
输出文件包含 T 行,分别对应 T 组数据的答案,如果在第 i 组数据中, Jerry 能从下 表面跑到上表面,则输出“Yes”,如果不能,则输出“No”(均不包含引号)。
提示
【数据规模与约定】
对于 20%的数据, n = 1, 1 ≤ h , r ≤ 10,000,坐标的绝对值不超过 10,000。
对于 40%的数据, 1 ≤ n ≤ 8, 1 ≤ h , r ≤ 10,000,坐标的绝对值不超过 10,000。
对于 80%的数据,1 ≤ n ≤ 1,000, 1 ≤ h , r ≤ 10,000,坐标的绝对值不超过 10,000。
对于 100%的数据, 1 ≤ n ≤ 1,000, 1 ≤ h , r ≤ 1,000,000,000, T ≤ 20,坐标的 绝对值不超过 1,000,000,000。
如果两个洞相连就在同一个并查集里面,同时上下也是相当于一个空洞,一起维护
然后维护一下就完了
code:
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 using namespace std; 5 unsigned long long fa[10005]; 6 unsigned long long find(unsigned long long x){ 7 if(x!=fa[x])return fa[x]=find(fa[x]); 8 return fa[x]; 9 } 10 void merge(unsigned long long x,unsigned long long y){ 11 unsigned long long f1=find(x),f2=find(y); 12 if(f1!=f2){ 13 fa[f1]=f2; 14 } 15 } 16 unsigned long long x[10000],y[10000],z[10000]; 17 unsigned long long sq(unsigned long long x){ 18 return x*x; 19 } 20 unsigned long long getdis(unsigned long long i,unsigned long long j){ 21 return sq(x[i]-x[j])+sq(y[i]-y[j])+sq(z[i]-z[j]); 22 } 23 int main(){ 24 unsigned long long T; 25 cin>>T; 26 while(T--){ 27 unsigned long long n,h,R; 28 cin>>n>>h>>R; 29 for(unsigned long long i=0;i<=n+1;i++)fa[i]=i; 30 for(unsigned long long i=1;i<=n;i++){ 31 cin>>x[i]>>y[i]>>z[i]; 32 } 33 for(unsigned long long i=1;i<=n;i++){ 34 for(unsigned long long j=1;j<=n;j++){ 35 if(i==j)continue; 36 if(getdis(i,j)<=4*R*R){ 37 merge(i,j); 38 } 39 } 40 } 41 for(unsigned long long i=1;i<=n;i++){ 42 if(z[i]<=R)merge(i,0); 43 if(z[i]+R>=h)merge(i,n+1); 44 } 45 if(find(0)==find(n+1)){ 46 cout<<"Yes"<<' '; 47 } 48 else{ 49 cout<<"No"<<' '; 50 } 51 } 52 return 0; 53 }
over