HDU 1558 Segment Set

来源:互联网 发布:深圳买房 知乎 编辑:程序博客网 时间:2024/05/16 19:01

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

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

package hdu;import java.awt.geom.Line2D;import java.util.ArrayList;import java.util.Scanner;/** * @description HDU 1558 * @technique并查集 * @date20120814 * @time11:28 * @version1.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();}}


 

原创粉丝点击