4 1 0 1 0 2 0 3 0 4 O 1 O 2 O 4 S 1 4 O 3 S 1 4Sample Output
FAIL
SUCCESS
分析:这道题就是一个并查集的简单应用,只要满足题目所给的距离值即可纳入能连通的集合,同时也要满足被修好的条件,如果两个电脑都在这个集合里面那么就可以通信了。
上代码:
import java.util.*;
public class Main {
static Scanner in = new Scanner(System.in);
static int n,d;
static boolean[] vis = new boolean[1005];
static int[] f = new int[1005];
static List st = new ArrayList();
//计算两点距离
static double dis(Node s1,Node s2){
double d=Math.sqrt((s1.x-s2.x)*(s1.x-s2.x)+(s1.y-s2.y)*(s1.y-s2.y));
return d;
}
//判断是否可以纳入集合
static void judge(int x){
for (int i = 1; i <= n; i++) {
//纳入的条件就是已经被修好并且两者之间的距离小于最大值
if(vis[i]&&dis(st.get(i-1),st.get(x-1))<=d+(1e-6))
merge(i, i+1);
}
}
static int find(int x){
int r = x;
while(r!=f[r]){
r=f[r];
}
return r;
}
static void merge(int x,int y){
int t1 = find(x);
int t2 = find(y);
if(t1!=t2)
f[t1]=t2;
}
public static void main(String[] args) {
Arrays.fill(vis, false);
n = in.nextInt();
d = in.nextInt();
for (int i = 1; i <=n; i++) {
f[i]=i;
}
for (int i = 1; i <= n; i++) {
Node s = new Node();
s.x=in.nextInt();
s.y=in.nextInt();
st.add(s);
}
String s;
int t1,t2;
while(in.hasNext()){
s = in.next();
if(s.charAt(0)=='0'){
t1 = in.nextInt();
vis[t1]=true;//一定要标记,不然相当于没有修过即使距离满足也没用啊。。
judge(t1);
}else{
t1 = in.nextInt();
t2 = in.nextInt();
if(find(t1)==find(t2))//如果在集合里面,说明联通了
System.out.println("SUCCESS");
else
System.out.println("FAIL");
}
}
}
}
class Node{
int x,y;
}