10.27T4 奶酪 并查集

#2750 奶酪

描述
10.27T4 奶酪 并查集
输入

每个输入文件包含多组数据。

输入文件的第一行,包含一个正整数 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
提示
10.27T4 奶酪 并查集

【数据规模与约定】

对于 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