• 10.27T4 奶酪 并查集


    #2750 奶酪

    描述
    20171115214836_35930
    输入

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

    输入文件的第一行,包含一个正整数 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
    提示
    20171115214845_92394

    【数据规模与约定】

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

  • 相关阅读:
    第十四周课程总结&实验报告(简单记事本的实现)
    第十三周课程总结
    第十二周
    第十一周课程总结
    第十周课程总结
    第九周课程总结&实验报告(七)
    第八周课程总结&实验报告(六)
    第七周课程总结&实验报告(五)
    第六周&java实验报告四
    课程总结
  • 原文地址:https://www.cnblogs.com/saionjisekai/p/9861283.html
Copyright © 2020-2023  润新知