行了这是个裸的判联通的题,dfs bfs 并查集均可
这是并查集的做法
#include <bits/stdc++.h> using namespace std; const double eps = 1e-8; const int maxn = 1e3 + 10; int sgn(double x) { if (fabs(x) < eps) return 0; else return x > 0 ? 1 : -1; } int n; double r; double x[maxn], y[maxn]; int fa[maxn]; void Init() {for (int i = 0; i < maxn; ++i) fa[i] = i;} int find(int X) {return X == fa[X] ? fa[X] : fa[X] = find(fa[X]);} void Unin(int X, int Y) { X = find(X); Y = find(Y); if (X != Y) { fa[X] = Y; } } double dis(int i, int j) { return hypot(x[i] - x[j], y[i] - y[j]); } int main() { int t; scanf("%d", &t); while (t--) { Init(); scanf("%d %lf", &n, &r); r *= 2.0; for (int i = 1; i <= n; ++i) { scanf("%lf %lf", x + i, y + i); } for (int i = 1; i <= n; ++i) { if (sgn(x[i] - r) <= 0) { Unin(0, i); } if (sgn(100 - x[i] - r) <= eps) { Unin(i, n + 1); } } for (int i = 1; i <= n; ++i) { for (int j = i + 1; j <= n; ++j) { if (sgn(dis(i, j) - r) <= 0) { Unin(i, j); } } } puts(find(0) != find(n + 1) ? "Yes" : "No"); } return 0; }dfs做法
#include <bits/stdc++.h> #include<vector> using namespace std; typedef long long LL; typedef pair<double, double> pdd; const int N = 1e3 + 10; const int M = 2e6 + 10; const int inf = 0x3f3f3f3f; const double eps = 1e-5; double x[N]; double y[N]; vector<int> G[N]; bool vis[N]; bool dfs(int u) { vis[u]=true; if(!u) return true; vector<int>::iterator it; for(it=G[u].begin();it!=G[u].end();it++) if(!vis[*it]) if(dfs(*it))return true; return false; } int main() { int T;cin>>T; for (;T--;) { int n; double r; scanf("%d%lf",&n,&r); for(int i=1;i<=n;i++) scanf("%lf%lf",&x[i],&y[i]); double d=2*r,d2=d*d; if (d >= 100) { puts("No"); continue; } for (int i = 1; i <= n; i++) { if (x[i] <= d) { G[0].push_back(i); G[i].push_back(0); } if (100 - x[i] <= d) { G[n + 1].push_back(i); G[i].push_back(n + 1); } } for (int i = 1; i <= n; i++) { for (int j = i + 1; j <= n; j++) { double f = (x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]); if (f - d2 <= eps) { G[i].push_back(j); G[j].push_back(i); } } } if (dfs(n + 1)) puts("No"); else puts("Yes"); for (int i = 0; i <= n + 1; i++) { G[i].clear(); vis[i] = false; } } return 0; }bfs 牛客网copy的己卯年三月十二 的代码
#include <iostream> #include <stdio.h> #include <string.h> #include <string> #include <vector> #include <algorithm> #include <queue> #include<bits/stdc++.h> #include <stdlib.h> using namespace std; #define ull unsigned long long #define ll long long typedef pair<int,int> pii; typedef pair<double,double> pdd; typedef pair<double,int> pdi; const int maxn=1e3+5; const double eps=1e-8; pdd a[maxn]; int n,vis[maxn]; double r; vector<int> G[maxn]; bool touchL(int x){ return a[x].first-2.0*r<eps; } bool touchR(int x){ return 100.0-a[x].first-2.0*r<eps; } bool touch(int x,int y){ double dx=a[x].first-a[y].first,dy=a[x].second-a[y].second; return dx*dx+dy*dy-4.0*r*r<eps; } bool bfs(void){ if(100.0-2.0*r<eps) return false; queue<int> q; memset(vis,0,sizeof(vis)); for(int i=1;i<=n;++i)if(touchL(i)) q.push(i),vis[i]=1; if(q.empty()) return true; while(!q.empty()){ int u=q.front();q.pop(); if(touchR(u)) return false; for(int i=0;i<G[u].size();++i)if(!vis[G[u][i]]){ int v=G[u][i];vis[v]=1; q.push(v); } } return true; } int main(void){ int T;scanf("%d",&T); while(T--){ scanf("%d%lf",&n,&r); for(int i=1;i<=n;++i){ G[i].clear(); scanf("%lf%lf",&a[i].first,&a[i].second); } for(int i=1;i<=n;++i) for(int j=1;j<i;++j)if(touch(i,j)){ G[i].push_back(j);G[j].push_back(i); } if(bfs()) puts("Yes"); else puts("No"); } return 0; }