如题:http://poj.org/problem?id=2236
Time Limit: 10000MS | Memory Limit: 65536K | |
Total Submissions: 19456 | Accepted: 8173 |
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
思路 :使用in数组记录当前电脑是否在网络中,然后每次将在网络中的集合尝试合并,能连接就合并。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
using namespace std;
#define MAXN 1005
struct point
{
int x,y;
};
point a[MAXN];
int in[MAXN];
int f[MAXN];
double dis(point a,point b)
{
return sqrt((double)((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)));
}
int find(int x)
{
if(x==f[x])
return x;
return f[x]=find(f[x]);
}
void Union(int x,int y)
{
int fx=find(x);
int fy=find(y);
f[fx]=fy;
}
int same(int x,int y)
{
if(find(x)==find(y))
return 1;
return 0;
}
int main()
{
// freopen("C:\\1.txt","r",stdin);
int N,d;
cin>>N>>d;
int i;
for(i=1;i<=N;i++)
{
cin>>a[i].x>>a[i].y;
f[i]=i;
}
string str;
while(cin>>str)
{
if(str[0]=='O')
{
int t;
cin>>t;
in[t]=1;
for(i=1;i<=N;i++)
if(i!=t&&in[i]&&dis(a[i],a[t])<=d)
Union(i,t);
}
else
{
int t1,t2;
cin>>t1>>t2;
if(same(t1,t2))
cout<<"SUCCESS"<<endl;
else
cout<<"FAIL"<<endl;
}
}
return 0;
}