n台电脑,在其正常时能与<=d范围内正常的电脑通信
开始,所有电脑都坏掉了,O a表示修好了a电脑,S a b查询a b电脑是否可通信
每次修好一台电脑,就枚举一遍所有已经修好的电脑,判断他们是否在d范围内,是的话就并查集合并
#include <iostream> #include <cstring> #include <string> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <queue> #include <map> #define inf 0x3f3f3f3f #define ll __int64 using namespace std; int vis[1010],D,n,x[1010],y[1010],r[1010]; double d[1010][1010]; int root(int a) { if(r[a]==a) return a; while(r[a]!=a) a=r[a]; return r[a]; } int main() { int i,j,ra,ri,a,b; char s[10]; while(~scanf("%d%d",&n,&D)) { for(i=1;i<=n;i++) { scanf("%d%d",&x[i],&y[i]); } for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(i==j) d[i][j]=0; else d[i][j]=d[i][j]=sqrt((x[i]-x[j])*(x[i]-x[j])*1.0+(y[i]-y[j])*(y[i]-y[j])*1.0); } } for(i=0;i<=n;i++) r[i]=i; memset(vis,0,sizeof vis); while(~scanf("%s",s)) { if(s[0]==‘O‘) { scanf("%d",&a); if(vis[a]) continue; for(i=1;i<=n;i++) { if(vis[i]) { if(d[i][a]<=D) { ri=root(i); ra=root(a); r[ri]=ra; } } } vis[a]=1; } else { scanf("%d%d",&a,&b); ri=root(a); ra=root(b); if(ra==ri) printf("SUCCESS\n"); else printf("FAIL\n"); } } } return 0; }
wust April Chanllenge 2014 D题 poj2236 Wireless Network,布布扣,bubuko.com