POJ2236-Wireless Network-并查集
模板题
对于每修复一台终端,就遍历所有其他已修复的终端,如果距离在d之内,就union。
之后看是否在一个并查集中。
#include <cstdio> #include <algorithm> #include <cstring> using namespace std; int N,D,pos[1010][2],rp[1010]; int fa[1010]; int Find(int x) { int r = x; while(r != fa[r]) r = fa[r]; int i=x,j; while(fa[i] != r) { j = fa[i]; fa[i] = r; i = j; } return r; } void Union(int x,int y) { int fx = Find(x),fy = Find(y); if(fx != fy) fa[fy] = fx; } int dis(int x,int y) { return abs(pos[x][0]-pos[y][0])*abs(pos[x][0]-pos[y][0])+abs(pos[x][1]-pos[y][1])*abs(pos[x][1]-pos[y][1]); } int main() { scanf("%d%d",&N,&D); for(int i=1;i<=N;i++) { scanf("%d%d",&pos[i][0],&pos[i][1]); fa[i] = i; } char op[5]; int p,q; while(~scanf("%s",op)) { if(op[0] == 'O') { scanf("%d",&p); rp[p] = 1; for(int i=1;i<=N;i++)if(i!=p &&rp[i]&&dis(i,p)<=D*D) { Union(i,p); //printf("link %d %d\n",i,p); } } else if(op[0] == 'S') { scanf("%d%d",&p,&q); if(rp[p] && rp[q] && Find(p) == Find(q)) printf("SUCCESS\n"); else printf("FAIL\n"); } } }