#2750 奶酪
描述
输入
每个输入文件包含多组数据。
输入文件的第一行,包含一个正整数 T,代表该输入文件中所含的数据组数。
接下来是 T 组数据,每组数据的格式如下:
第一行包含三个正整数 n, h 和 r, 两个数之间以一个空格分开,分别代表奶酪中空 洞的数量,奶酪的高度和空洞的半径。
接下来的 n 行,每行包含三个整数 x、 y、 z, 两个数之间以一个空格分开, 表示空 洞球心坐标为(x, y, z)。
输出
输出文件包含 T 行,分别对应 T 组数据的答案,如果在第 i 组数据中, Jerry 能从下 表面跑到上表面,则输出“Yes”,如果不能,则输出“No”(均不包含引号)。
样例输入[复制]
3 2 4 1 0 0 1 0 0 3 2 5 1 0 0 1 0 0 4 2 5 2 0 0 2 2 0 4
样例输出[复制]
Yes No Yes
提示
【数据规模与约定】
对于 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 #include2 #include 3 #include 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"<<'\n';47 }48 else{49 cout<<"No"<<'\n';50 }51 }52 return 0;53 }
over