NOI 奶酪

思路:并查集详细讲解——https://blog.csdn.net/u013546077/article/details/64509038

本题主要是找到两个相切且能穿透奶酪的点,即为所求答案。

用到方法为图论:当两个点可以相连,代码为:dong[pre(i)]=pre(j);//i点与j点满足条件,则委屈一下j。最后将上表面,可相连的洞,以及下表面相连。最后若相连成功则输出YES,否则输出NO

#include<iostream>
#include<cstdio>
#include<cmath>
int x[10],y[10],z[10];
int pre();//上级
int dong[10];//根节点
using namespace std;
int n,h,r;
double ph(double x){
    return x*x;
}
bool check(int a,int b){
    if(sqrt(ph(x[a]-x[b])+ph(y[a]-y[b])+ph(z[a]-z[b]))<=2*r)
        return true;
    else
        return false;
}
int pre(int x){
    if(dong[x]==x)
        return x;
    else
        return dong[x]=pre(dong[x]);//找到节点dong[x]的上级并返回根节点
}
int main(){
    int T;
    cin>>T;
    while(T--){
        cin>>n>>h>>r;
        for(int i=1;i<=n;i++)
            cin>>x[i]>>y[i]>>z[i];
        for(int i=1;i<=n+2;i++)
            dong[i]=i;//初始化
        for(int i=1;i<=n;i++)
            for(int j=i+1;i<=n;i++){
                if(!check(i,j))
                    continue;
                else
                    dong[pre(i)]=pre(j);
            }
        for(int i=1;i<=n;i++){
            if(z[i]+r>=h)
                dong[pre(n+1)]=pre(i);
            if(z[i]-r<=0)
                dong[pre(n+2)]=pre(i);
        }
        printf("%s\n",pre(n+1)==pre(n+2)?"Yes":"No");
    }
    return 0;
}

 

posted on 2019-09-17 15:56  姜姜糖  阅读(139)  评论(0编辑  收藏  举报