【NOIP2017提高組 day2】乳酪
阿新 • • 發佈:2018-11-08
題目
題解
–很簡單,就是n^2建圖,bfs一遍就好了,記得開longlong
程式碼
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
const int MAXN=1005;
int t,n;
long long h,r;
long long x[MAXN],y[MAXN],z[MAXN];
vector<int>g[MAXN];
int q[MAXN],head,tail;
bool isv[MAXN];
long long f(long long a){
return a*a;
}
long long l(int a,int b){
return f(x[a]-x[b])+f(y[a]-y[b])+f(z[a]-z[b]);
}
bool bfs(){
head=1;
tail=1;
q[head]=0;
isv[0]=1;
while(head<=tail){
int x=q[ head];
if(x==n+1)
return 1;
for(int i=0;i<g[x].size();i++){
int y=g[x][i];
if(!isv[y]){
q[++tail]=y;
isv[y]=1;
}
}
head++;
}
return 0;
}
int main(){
// freopen("cheese.in","r",stdin);
// freopen("cheese.out","w",stdout);
cin>>t;
while(t--){
scanf("%d%lld%lld",& n,&h,&r);
for(int i=0;i<=n+1;i++)
g[i].clear();
for(int i=1;i<=n;i++){
scanf("%lld%lld%lld",&x[i],&y[i],&z[i]);
for(int j=1;j<i;j++)
if(l(i,j)<=4*r*r){
g[i].push_back(j);
g[j].push_back(i);
}
if(z[i]<=r){
g[0].push_back(i);
g[i].push_back(0);
}
if(z[i]+r>=h){
g[n+1].push_back(i);
g[i].push_back(n+1);
}
}
memset(isv,0,sizeof(isv));
if(bfs())
printf("Yes\n");
else
printf("No\n");
}
return 0;
}