POJ2236并查集

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) {
		new Task().solve() ; 
	}
}

class Task {
	InputReader in = new InputReader(System.in) ;
	PrintWriter out = new PrintWriter(System.out) ;
	
	class Point{
		int x , y ;
		Point(int x , int y){
			this.x = x ; 
			this.y = y ;
		}
		int dist(Point o){
			int dx = x - o.x ;
			int dy = y - o.y ;
			return dx * dx + dy * dy ;
		}
	}
	
	Point[] p ;
	int[] father ;
	
	int getFather(int u){
		if(u == father[u]) return u ;
		else return father[u] = getFather(father[u]) ;
	}
	
	void union(int u , int v){
		u = getFather(u) ;
		v = getFather(v) ;
		if(u != v) father[u] = v ; 
	}

	void solve() {
		int n = in.nextInt() ;
		int d = in.nextInt() ;
		d *= d ; 
		father = new int[n+1] ;
		for(int i = 1 ; i <= n ; i++) father[i] = i ;
		p = new Point[n+1] ;
		for(int i = 1 ; i <= n ; i++)
			p[i] = new Point(in.nextInt() , in.nextInt()) ;
		List<Integer> repair = new ArrayList<Integer>() ;
		while(in.hasNext()){
			if("O".equals(in.next())){
				int u = in.nextInt() ;
				for(int v : repair){
					if(p[u].dist(p[v]) <= d)
						union(u, v) ;
				}
				repair.add(u) ;
			}
			else{
				out.println(getFather(in.nextInt()) == getFather(in.nextInt()) ? "SUCCESS" : "FAIL") ;
			}
			//out.flush() ;
		}
        out.flush() ; 
	}
}

class InputReader {
	public BufferedReader reader;
	public StringTokenizer tokenizer;

	public InputReader(InputStream stream) {
		reader = new BufferedReader(new InputStreamReader(stream), 32768);
		tokenizer = new StringTokenizer("");
	}

	private void eat(String s) {
		tokenizer = new StringTokenizer(s);
	}

	public String nextLine() {
		try {
			return reader.readLine();
		} catch (Exception e) {
			return null;
		}
	}

	public boolean hasNext() {
		while (!tokenizer.hasMoreTokens()) {
			String s = nextLine();
			if (s == null)
				return false;
			eat(s);
		}
		return true;
	}

	public String next() {
		hasNext();
		return tokenizer.nextToken();
	}

	public int nextInt() {
		return Integer.parseInt(next());
	}

	public long nextLong() {
		return Long.parseLong(next());
	}

	public double nextDouble() {
		return Double.parseDouble(next());
	}

	public BigInteger nextBigInteger() {
		return new BigInteger(next());
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值