题目意思很简单 就是给你n个节点的坐标 有两种操作: 1.修复这个节点 2.询问两个节点是否连通,如果连通,前提是这两个节点都是好的,而且距离要小于等于给出的距离 这个题是一个最简单的并查集模型 #include <stdio.h> #include <string.h> #include <math.h> #define N 1005 int father[N],flag[N]; double map[N][2],dis[N][N]; void make_set(int n) { int i; for(i=0;i<=n;i++) { father[i]=i; } } int find_set(int x) { if(x!=father[x]) father[x]=find_set(father[x]); return father[x]; } void Union(int x,int y) { x=find_set(x),y=find_set(y); father[y]=x; } double length(double x1,double y1,double x2,double y2) { return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); } int main() { int n; double d; while(scanf("%d%lf",&n,&d)==2) { int i,j; memset(flag,0,sizeof(flag)); make_set(n); for(i=1;i<=n;i++) scanf("%lf%lf",&map[i][0],&map[i][1]); for(i=1;i<=n;i++) for(j=1;j<=n;j++) dis[i][j]=length(map[i][0],map[i][1],map[j][0],map[j][1]); char s[2]; int x,y; while(scanf("%s",s)!=EOF) { if(s[0]=='O') { scanf("%d",&x); flag[x]=1; //表示该节点已经修复 for(i=1;i<=n;i++) if(flag[i]&&dis[x][i]<=d)//如果距离小于d那么就加入集合 Union(x,i); } else { scanf("%d%d",&x,&y); if(find_set(x)==find_set(y)) puts("SUCCESS"); else puts("FAIL"); } } } return 0; }