乳酪sol
阿新 • • 發佈:2020-07-30
- 直接用並查集維護連通性
- 然而我用了連邊後bfs,較慢
#include<bits/stdc++.h> #define fi first #define se second #define pb push_back #define mp make_pair #define SZ(x) ((int)x.size()) #define ALL(x) x.begin(),x.end() #define U(i,u) for(register int i=head[u];i;i=nxt[i]) #define rep(i,a,b) for(register int i=(a);i<=(b);++i) #define per(i,a,b) for(register int i=(a);i>=(b);--i) using namespace std; typedef long double ld; typedef long long ll; typedef unsigned int ui; typedef pair<int,int> PII; typedef vector<int> VI; template<class T> inline void read(T &x){ x=0;char c=getchar();int f=1; while(!isdigit(c)){if(c=='-')f=-1;c=getchar();} while(isdigit(c)){x=x*10+c-'0';c=getchar();}x*=f; } template<class T> inline void cmin(T &x, T y){x=x<y?x:y;} template<class T> inline void cmax(T &x, T y){x=x>y?x:y;} const int N=2010; const ld ex=1e-8; int n,s,t; ld h,r,x[N],y[N],z[N]; int head[N],nxt[N*N],v[N*N],cnt; int ge[N]; void add(int a,int b){ nxt[++cnt]=head[a];head[a]=cnt;v[cnt]=b; } ld calc(int i,int j){ if(i==j)return 0; else{ ld a=x[i]-x[j],b=y[i]-y[j],c=z[i]-z[j]; return sqrt(a*a+b*b+c*c); } } void bfs(){ queue<int>q; q.push(s);ge[s]=1; while(SZ(q)){ int u=q.front();q.pop(); U(i,u){ if(ge[v[i]]==1)continue; else{ ge[v[i]]=1;q.push(v[i]); if(v[i]==t)return; } } } } int main(){ int T;read(T);while(T--){ memset(head,0,sizeof(head)); memset(ge,0x3f,sizeof(ge)); read(n);scanf("%Lf %Lf",&h,&r);rep(i,1,n)scanf("%Lf %Lf %Lf",&x[i],&y[i],&z[i]); s=n+1;t=n+2; rep(i,1,n)rep(j,1,n)if(i^j)if(calc(i,j)-2*r<=ex)add(i,j); rep(i,1,n)if(h-z[i]-r<=ex)add(s,i);rep(i,1,n)if(z[i]-0-r<=ex)add(i,t); bfs(); if(ge[t]<0x3f3f3f3f)printf("Yes\n"); else printf("No\n"); } return 0; }