[Luogu] 奶酪

https://www.luogu.org/problemnew/show/P3958

连边bfs / 并查集

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>

using namespace std;
const int N = 1010;

#define gc getchar()

struct Node{
    double x, y, z;
}E[N];

int n;
double h, r;
int T;
int f[N];

inline int read(){
    int x = 0; char  c = gc;
    while(c < '0' || c > '9') c = gc;
    while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = gc;
    return x;
}

int getf(int x){
    return f[x] == x ? x : f[x] = getf(f[x]);
}

inline bool calc_dis(int x, int y){
    double X1 = E[x].x, Y1 = E[x].y, Z1 = E[x].z;
    double X2 = E[y].x, Y2 = E[y].y, Z2 = E[y].z;
    double dis = sqrt((X1 - X2) * (X1 - X2) + (Y1 - Y2) * ((Y1 - Y2)) + (Z1 - Z2) * (Z1 - Z2));
    return dis <= r * 2 ? 1 : 0;
}

inline bool dis_0(int x){
    if(abs(E[x].z - 0) <= r) return 1;
    return 0;
}

inline bool dis_h(int x){
    if(abs(E[x].z - h) <= r) return 1;
    return 0;
}

int main()
{
    T = read();
    while(T --){
        n = read();
        scanf("%lf%lf", &h, &r);
        for(int i = 1; i <= n; i ++) f[i] = i;
        for(int i = 1; i <= n; i ++) scanf("%lf%lf%lf", &E[i].x, &E[i].y, &E[i].z);
        for(int i = 1; i <= n; i ++){
            for(int j = 1; j <= n; j ++){
                if(i != j && calc_dis(i, j)){
                    f[getf(i)] = f[getf(j)];
                }
            }
        }
        bool flag = 1;
        for(int i = 1; i <= n && flag; i ++){
            for(int j = 1; j <= n && flag; j ++){
                if(dis_0(i) && dis_h(j) && getf(i) == getf(j)){
                    puts("Yes");
                    flag = 0;
                }
            }
        }
        if(flag) puts("No");
    }
    return 0;
}
/*
1
2 5 1
0 0 1
0 0 4
*/

 

posted @ 2018-05-03 11:22  xayata  阅读(156)  评论(0编辑  收藏  举报