奶酪 noip dfs
题目:
https://ac.nowcoder.com/acm/problem/16417
dfs或者并查集
数据要开到long long
#include<iostream> #include<string.h> using namespace std; int mp[1002][1002],vis[1002]; long long n,h,r; struct node { long long x,y,z; }a[1002]; int dfs(int x,int t) { if(x==t) return 1; vis[x]=1; for(int i=1;i<=n+1;i++) { if(!vis[i]&&mp[x][i]) { if(dfs(i,t)) return 1; } } return 0; } int xianglian(node q,node w) { return (q.x-w.x)*(q.x-w.x)+(q.y-w.y)*(q.y-w.y)+(q.z-w.z)*(q.z-w.z)<=4*r*r; } int main() { int t; cin>>t; while(t--) { cin>>n>>h>>r; memset(vis,0,sizeof(vis)); memset(mp,0,sizeof(mp)); for(int i=1;i<=n;i++) {cin>>a[i].x>>a[i].y>>a[i].z; if(a[i].z<=r) mp[0][i]=1; if(h-a[i].z<=r) mp[i][n+1]=1; } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(i!=j&&xianglian(a[i],a[j])) mp[i][j]=1; } } if(dfs(0,n+1)) cout<<"Yes\n"; else cout<<"No\n"; } }
#include<iostream> using namespace std; long long n,h,r; int f[1200]; struct node { long long x,y,z; }a[1200]; int find(int x) { return x==f[x]?x:f[x]=find(f[x]); } int xianglian(node q,node w) { return (q.x-w.x)*(q.x-w.x)+(q.y-w.y)*(q.y-w.y)+(q.z-w.z)*(q.z-w.z)<=4*r*r; } void merge(int i,int j) { int fx=find(i); int fy=find(j); if(fx==fy) ; else f[fx]=fy; } int main() { int t; cin>>t; while(t--) { cin>>n>>h>>r; for(int i=0;i<=n+1;i++) f[i]=i; for(int i=1;i<=n;i++) {cin>>a[i].x>>a[i].y>>a[i].z; if(a[i].z<=r) merge(0,i); if(h-a[i].z<=r) merge(i,n+1); } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(i!=j&&xianglian(a[i],a[j])) { merge(i,j); } } } if(find(0)==find(n+1)) cout<<"Yes\n"; else cout<<"No\n"; } }
浙公网安备 33010602011771号