题目链接:https://vjudge.net/problem/POJ-2236
题意:给多个电脑的坐标,初始电脑都是损坏的,O操作代表维修电脑,S操作查询两电脑是否可以通讯。两电脑可以通讯的前提是距离不超过d,可以由多台电脑中转。
思路:一开始的bfs超时了。判断是否连通其实用不到bfs,一个并查集就好了。
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <cstring>
#include <iostream>
#include <cmath>
#include <map>
#include <list>
#include <stack>
using namespace std;
struct node
{
int x,y;
int id;
} no[1005];
vector <node> v,g[1005];
int pa[1005];
double calc(node a,node b)
{
double x=a.x-b.x;
double y=a.y-b.y;
return sqrt(x*x+y*y);
}
int fnd(int x)
{
return x==pa[x]?x:pa[x]=fnd(pa[x]);
}
int main()
{
int n,d;
scanf("%d%d",&n,&d);
for(int i=1; i<=n; i++)
{
pa[i]=i;
scanf("%d%d",&no[i].x,&no[i].y);
no[i].id=i;
}
char s[100];
while(~scanf("%s",s))
{
int a,b;
if(s[0]=='S')
{
scanf("%d%d",&a,&b);
int x=fnd(a),y=fnd(b);
if(x==y)
{
printf("SUCCESS\n");
}
else
printf("FAIL\n");
}
else
{
scanf("%d",&a);
int l=v.size();
for(int i=0; i<l; i++)
{
if(calc(v[i],no[a])<=d)
{
int x=v[i].id,y=a;
x=fnd(x),y=fnd(y);
if(x!=y)
pa[x]=y;
}
}
v.push_back(no[a]);
}
}
return 0;
}