#include <iostream> #include <cstring> using namespace std; typedef struct ufset { int *x; int *y; int *parent; bool *flag; }ufset,*UFSet; UFSet Init(int N) { UFSet U=new ufset[N+1]; U->x=new int[N+1]; U->y=new int[N+1]; U->parent=new int[N+1]; U->flag=new bool[N+1]; for(int i=1;i<=N;i++) { cin >> U->x[i] >> U->y[i]; U->parent[i]=-1; U->flag[i]=0; } return U; } int Find(UFSet U,int e) { int eParent=e; while(U->parent[eParent]>=0) eParent=U->parent[eParent]; int temp; while(e!=eParent) { temp=U->parent[e]; U->parent[e]=eParent; e=temp; } return eParent; } int Union(UFSet U,int i,int j) { int p1=Find(U,i); int p2=Find(U,j); if(p1==p2) return p1; if(U->parent[p1]<U->parent[p2]) { U->parent[p1]+=U->parent[p2]; U->parent[p2]=p1; return p1; } else { U->parent[p2]+=U->parent[p1]; U->parent[p1]=p2; return p2; } } int main() { int N,D; cin >> N >> D; UFSet U=Init(N); char type; int i,j; while(cin >> type) { if(type=='O') { cin >> i; for(int k=1;k<=N;k++) if(i!=k && U->flag[k]) { int temp1=U->x[i]-U->x[k]; int temp2=U->y[i]-U->y[k]; if( temp1*temp1 + temp2*temp2<=D*D) Union(U,i,k); } U->flag[i]=1; } else { cin >> i >> j; if(Find(U,i)==Find(U,j)) cout << "SUCCESS" << endl; else cout << "FAIL" << endl; } } return 0; } 此程序还需优化;此题还有其他方法,正在不断探索。。。 2.DFS 回溯法的解法,不过会超时,Z时间复杂度高 #include <iostream> #include <cstring> using namespace std; typedef struct point { int x; int y; }point; bool* flag; bool* visited; bool DFS(int m,int n,int N,int D,point *p) { if(m>N || n >N) return 0; if(m==n) return 1; else { for(int i=1;i<=N;i++) { if(flag[i] && !visited[i]) { int Temp1=p[m].x-p[i].x; int Temp2=p[m].y-p[i].y; if (Temp1*Temp1 + Temp2*Temp2<=D*D) { visited[i]=1; if(DFS(i,n,N,D,p)) return 1; } } } visited[m]=0; return 0; } } int main() { int N,D; cin >> N >> D; point* p=new point[N+1]; flag=new bool[N+1]; visited=new bool[N+1]; for(int i=1;i<=N;i++) cin >> p[i].x >> p[i].y; memset(flag,0,(N+1)*sizeof(bool)); memset(visited,0,(N+1)*sizeof(bool)); char type; int m,n; while(cin >> type ) { if(type=='O') { cin >> m; flag[m]=1; } else { cin >> m >> n; if(!flag[m] || !flag[n]) cout << "FAIL" << endl; else { visited[m]=1; if(DFS(m,n,N,D,p)) cout << "SUCCESS" << endl; else cout << "FAIL" << endl; memset(visited,0,(N+1)*sizeof(bool)); } } } delete []p; delete []flag; delete []visited; return 0; }