HDU 1558 Segment Set

还是并查集的问题,不过里面判断两条线段是否相交,这是个难点。不过这对于我们学JAVA的来说,小说一桩了。

自己查下 API  里面有个类: Line2D ,是不是很牛叉。。。。。

package hdu;

import java.awt.geom.Line2D;
import java.util.ArrayList;
import java.util.Scanner;
/**
 * @description 							HDU 1558
 * @technique								并查集
 * @date									20120814
 * @time									11:28
 * @version									1.0
 * @author Alex
 */
public class Hdu1558_20120814_0 {
	private static int [] set = new int[1001];
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int count,n,i,size,j;
		double x1,y1,x2,y2;
		ArrayList<Line2D> list = new ArrayList<Line2D>();
		count = in.nextInt();
		String cms;
		int cmi, res;
		for(j = 0; j < count; ++j){
			if(j!=0){
				System.out.println();
			}
			n = in.nextInt();
			init(n);
			int n1 = n;
			while(n1-->0){
				cms = in.next();
				if(cms.charAt(0) == 'P'){
					x1 = in.nextDouble(); y1 = in.nextDouble();
					x2 = in.nextDouble(); y2 = in.nextDouble();
					list.add(new Line2D.Double(x1,y1,x2,y2));
					size = list.size();
					for(i = 0; i < size; ++i){
						if(list.get(size-1).intersectsLine(list.get(i))){
							meger(i+1,size);
						}
					}
				}else{
					cmi = in.nextInt();
					res = 0;
					for(i = 1; i <= n; ++i){
						if(findx(i) == findx(cmi)){
							++res;
						}
					}
					System.out.println(res);
				}
			}
//			show(n);
			list.clear();
		}
	}
	private static void init(int n){
		for(int i = 1; i <= n; ++i){
			set[i] = i;
		}
	}
	private static void meger(int x, int y){
		int fx = findx(x);
		int fy = findx(y);
		
		if(fx<fy){
			set[fy] = fx;
		}else{
			set[fx] = fy;
		}
	}
	private static int findx(int x){
		if(set[x]!= x){
			set[x] = findx(set[x]);
		}
		return set[x];
	}
	private static void show(int n){
		for(int i = 1; i <= n; ++i){
			System.out.print(set[i] + " ");
		}
		System.out.println();
	}
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值