原題傳送門
可以並查集維護兩點之間連通性
把起點和終點也看做兩個點
Code:
#include <bits/stdc++.h>
#define maxn 1010
#define LL long long
using namespace std;
int f[maxn], n;
LL x[maxn], y[maxn], z[maxn], h, r;
inline int read(){
int s = 0, w = 1;
char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') w = -1;
for (; isdigit(c); c = getchar()) s = (s << 1) + (s << 3) + (c ^ 48);
return s * w;
}
int getfa(int k){ return k == f[k] ? k : f[k] = getfa(f[k]); }
void Union(int x, int y){
int s1 = getfa(x), s2 = getfa(y);
if (s1 != s2) f[s1] = s2;
}
int main(){
int T = read();
while (T--){
n = read(), h = read(), r = read();
for (int i = 0; i <= n + 1; ++i) f[i] = i;
for (int i = 1; i <= n; ++i){
x[i] = read(), y[i] = read(), z[i] = read();
if (z[i] <= r) Union(0, i);
if (h - z[i] <= r) Union(i, n + 1);
}
for (int i = 1; i <= n; ++i)
for (int j = i + 1; j <= n; ++j)
if ((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]) + (z[i] - z[j]) * (z[i] - z[j]) <= 4LL * r * r) Union(i, j);
if (getfa(0) == getfa(n + 1)) puts("Yes"); else puts("No");
}
return 0;
}