题目大意:
某地发生了一次地震。ACM (Asia Cooperated Medical 亚洲联合医疗队) 已经为电脑搭建了一个无线网络。由于受到硬件的约束,每台电脑只能与距离它不超过 d 米的其它电脑直接通信。但每台电脑可被看作其它两台电脑的通信中转点,也就是说,如果电脑 A 和电脑 B 可以直接通信,或存在一台电脑 C 既可与 A 也可与 B 通信,那么电脑 A 和电脑 B 之间就能够通信。
在处理网络修复的过程中,工作人员们在任何一个时刻,可以执行两种操作:维修一台电脑,或测试两台电脑是否能够通信。请您找出全部的测试操作。
输入: 4 1 0 1 0 2 0 3 0 4 O 1 O 2 O 4 S 1 4 O 3 S 1 4 输出: FAIL SUCCESS
并查集模板,直接上代码:
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> using namespace std; struct Point{ int x,y; }point[1005]; int u,v,n,d,cnt,p[1005],fix[1005]; bool vis[1005]; double GetD(int u,int v){ int x = point[u].x - point[v].x; int y = point[u].y - point[v].y; return sqrt(1.0*x*x + 1.0*y*y); } int find(int x){ return x == p[x]? x:(p[x] = find(p[x])); } int main(){ int k,cnt=0; scanf("%d%d",&n,&d); for(int i=0 ;i<= n;i++) p[i] = i; for(int i=1 ;i<=n ;i++) scanf("%d%d",&point[i].x, &point[i].y); char ch[2]; memset(vis,false,sizeof(vis)); while (scanf("%s",ch)!=EOF) { if(ch[0] == 'O'){ scanf("%d",&k); if(vis[k]) continue; vis[k] = true; fix[++cnt] = k; for(int i=1 ;i<cnt ;i++){ u = fix[i]; double t = GetD(u,k); if(t <= d){ int fu = find(u); int fv = find(k); p[fu] = fv; } } } else { scanf("%d%d",&u,&v); int fu = find(u); int fv = find(v); if(fu == fv) printf("SUCCESS "); else printf("FAIL "); } } return 0; }