Time Limit: 10000MS | Memory Limit: 65536K | |
Total Submissions: 12374 | Accepted: 5217 |
Description
In the process of repairing the network, workers can take two kinds of operations at every moment, repairing a computer, or testing if two computers can communicate. Your job is to answer all the testing operations.
Input
1. "O p" (1 <= p <= N), which means repairing computer p.
2. "S p q" (1 <= p, q <= N), which means testing whether computer p and q can communicate.
The input will not exceed 300000 lines.
Output
Sample Input
4 1 0 1 0 2 0 3 0 4 O 1 O 2 O 4 S 1 4 O 3 S 1 4
Sample Output
FAIL SUCCESS
Source
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <queue> #include <cmath> #include <vector> using namespace std; vector <int> vc[1004]; bool v[1004]; struct node { double x,y; }a[1004]; int f[1004],r[1004]; double dis(double &x1,double &y1,double &x2,double &y2) { return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); } int Find(int x) { if(x!=f[x]) return f[x]=Find(f[x]); return x; } void un(int x,int y) { x=Find(x); y=Find(y); if(x==y) return; if(r[x]>r[y]) f[y]=x; else if(r[x]==r[y]) f[y]=x,r[x]++; else f[x]=y; } int main() { int N; double d,tp; scanf("%d %lf",&N,&d); int i,j; for(i=1;i<=N;i++) { f[i]=i; scanf("%lf %lf",&a[i].x,&a[i].y); } memset(r,0,sizeof(r)); for(i=1;i<N;i++) for(j=i+1;j<=N;j++) { tp=dis(a[i].x,a[i].y,a[j].x,a[j].y); if(tp-d<=1e-8) { vc[i].push_back(j); vc[j].push_back(i); } } char op[3]; int x,y; while(scanf("%s",op)!=EOF) { if(op[0]=='O') { scanf("%d",&x); v[x]=1; for(i=0;i<vc[x].size();i++) if(v[vc[x][i]]) { un(x,vc[x][i]); } } else { scanf("%d %d",&x,&y); x=Find(x);y=Find(y); if(x==y)printf("SUCCESS\n"); else printf("FAIL\n"); } } return 0; }