[Luogu] 奶酪

Posted xayata

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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
*/

 

以上是关于[Luogu] 奶酪的主要内容,如果未能解决你的问题,请参考以下文章

Luogu P1433 吃奶酪

Luogu P3958 奶酪

Luogu P2570 [ZJOI2010]贪吃的老鼠

luogu P1433 吃奶酪

解题报告:luogu P1433 吃奶酪

[Luogu 3958] NOIP2017 D2T1 奶酪