连接重新挂载的部分可以优化

package com.company.real;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.util.*;
//栅栏2 20190731真题public class Zhalan_20190731 {static int[] set;//保存点的父idstatic Map<String,Integer> map;// 1_1,1static Node0731[] nodes;//保存nodes节点,100000个铁丝网,最多可以连接100001个点static List<Edge0731>[] list;//存放每一个点(使用find后的数据) 相连的边static int N;static int Max_x=1087654321;//static int Max_y=2137654321;public static void main(String[] args) throws Exception{//System.setIn(new FileInputStream("C:\\Users\\XAGDC\\Desktop\\32Pro\\sample_input.txt"));System.setIn(new FileInputStream("C:\\Users\\XAGDC\\Desktop\\32Pro\\eval_input.txt"));BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));StringTokenizer st=new StringTokenizer(reader.readLine());int T=Integer.parseInt(st.nextToken());//测试用例的个数for (int zz = 0; zz < T; zz++) {map=new HashMap<String,Integer>();nodes=new Node0731[100001];st=new StringTokenizer(reader.readLine());N=Integer.parseInt(st.nextToken());//铁丝网的个数set=new int[N+1];list=new ArrayList[N+1];for (int i = 0; i <set.length ; i++) {set[i]=i;list[i]=new ArrayList<Edge0731>();}int index=-1;for (int i = 0; i <N ; i++) {//接收N个铁丝网st=new StringTokenizer(reader.readLine());int sx=Integer.parseInt(st.nextToken());int sy=Integer.parseInt(st.nextToken());int ex=Integer.parseInt(st.nextToken());int ey=Integer.parseInt(st.nextToken());String ss=sx+"_"+sy;String es=ex+"_"+ey;if(map.get(ss)==null){index++;map.put(ss,index);nodes[index]=new Node0731(sx,sy);}if(map.get(es)==null){index++;map.put(es,index);nodes[index]=new Node0731(ex,ey);}int a=map.get(ss);int b=map.get(es);if(!connected(a,b)){//如果没有相连,把这两个点连接起来union(a,b);}int m=a<b?a:b;list[find(m)].add(new Edge0731(sx,sy,ex,ey));}topUnion();//把所有的节点,都压缩到顶级节点,防止路径压缩不彻底的情况for (int i = 0; i <list.length ; i++) {List<Edge0731> li=list[i];if(li!=null && li.size()>0){if(set[i]!=i){int PI=set[i];list[PI].addAll(li);list[i]=null;}}}//System.out.println(Arrays.toString(set));//if(zz==2)System.out.println(Arrays.toString(nodes));//接收两个测试的点N1 N2String [] str=reader.readLine().split(" ");Node0731 N1=new Node0731(Integer.parseInt(str[0]) ,Integer.parseInt(str[1]));str=reader.readLine().split(" ");Node0731 N2=new Node0731(Integer.parseInt(str[0]) ,Integer.parseInt(str[1]));int count=0;//System.out.printf("第 %d 个用例 \n",(zz+1));for (int i=0;i<list.length;i++) {List<Edge0731> l=list[i];if(l!=null && l.size()>0){//if(zz==2)System.out.println(i+" pid: "+set[i]+" "+l);boolean r1=checkINOUT(l,N1);boolean r2=checkINOUT(l,N2);if((r1 && !r2) || (!r1 && r2)){// 两个结果不一样才需要穿越  两个都在里面,或者都在外面,不需要穿越count++;}}}System.out.printf("#%d %d \n",(zz+1),count);}reader.close();}/**** @param li* @param C* @return 在里面返回true,在外面返回false*/static boolean checkINOUT(List<Edge0731> li,Node0731 C){boolean result=false;int m=0;//Node0731 D=new Node0731(C.x+1,Max_y+101);Node0731 D=new Node0731(Max_x,C.y+1);for (int i = 0; i < li.size(); i++) {Edge0731 e=li.get(i);Node0731 A=new Node0731(e.sx,e.sy);Node0731 B=new Node0731(e.ex,e.ey);if(cross_check(A,B,C,D)){m++;}}//System.out.printf("点(%d,%d) 的相交个数 %d \n",C.x,C.y,m);if(m%2==1){//奇数,点在里面result=true;}return result;}public static void topUnion(){for (int i = 0; i <set.length ; i++) {set[i]=find(i);}}public static int find(int a){if(set[a]==a){return set[a];}else{return set[a]=find(set[a]);}}public static void union(int a,int b){int A=find(a);int B=find(b);if(A!=B){if(A<B){//把B挂到A上面set[B]=A;}else{set[A]=B;}}}public static boolean connected(int a,int b){int A=find(a);int B=find(b);return A==B;}static boolean cross_check(Node0731 A,Node0731 B,Node0731 C,Node0731 D){int abc=direction(A,B,C);int abd=direction(A,B,D);int cda=direction(C,D,A);int cdb=direction(C,D,B);if(abc*abd <=0 && cda*cdb<=0){//if(abc*abd <0 && cda*cdb<0){//System.out.printf("ABCD相交 A(%d,%d)->B(%d,%d) C(%d,%d)->D(%d,%d) \n",A.x,A.y,B.x,B.y,C.x,C.y,D.x,D.y);return true;}else{//System.out.printf("ABCD不相交 A(%d,%d)->B(%d,%d) C(%d,%d)->D(%d,%d) \n",A.x,A.y,B.x,B.y,C.x,C.y,D.x,D.y);return false;}}public static int direction(Node0731 A,Node0731 B,Node0731 C){int dxAB=B.x-A.x;int dyAB=B.y-A.y;int dxAC=C.x-A.x;int dyAC=C.y-A.y;int abc=BigInteger.valueOf(dxAB).multiply(BigInteger.valueOf(dyAC)).compareTo(BigInteger.valueOf(dyAB).multiply(BigInteger.valueOf(dxAC)));//int abc=dxAB*dyAC//int abc=dxAB*dyAC-dyAB*dxAC;if(abc>0){return -1;//顺时针}else if(abc<0){return 1;//逆时针}else{return 0;//A和B在一个点上}}
}
class Node0731{int x;int y;public Node0731(int x, int y) {this.x = x;this.y = y;}@Overridepublic String toString() {return "Node0731{" +"x=" + x +", y=" + y +'}';}
}
class Edge0731{int sx;int sy;int ex;int ey;public Edge0731(int sx, int sy, int ex, int ey) {this.sx = sx;this.sy = sy;this.ex = ex;this.ey = ey;}@Overridepublic String toString() {return "Edge0731{" +"sx=" + sx +", sy=" + sy +", ex=" + ex +", ey=" + ey +'}';}
}

SW练习_栅栏2_unionfind_凸包相关推荐

  1. LeetCode 587. 安装栅栏 / LintCode 1152. 安装栅栏(凸包检测:排序+叉积正负判断+正反扫描+去重)

    文章目录 1. 题目 2. 解题 1. 题目 在一个二维的花园中,有一些用 (x, y) 坐标表示的树. 由于安装费用十分昂贵,你的任务是先用最短的绳子围起所有的树. 只有当所有的树都被绳子包围时,花 ...

  2. mips sw指令_指令重排的意义

    现代计算机由三大部分组成(已经转化为以存储器为中心) CPU(Central Processing Unit) 中央处理器,核心部件为ALU(Arithmetic Logic Unit,算术逻辑单元) ...

  3. ks检验与s-w 检验_简单的方法教会你,利用SPSS对数据进行正态性检验

    导读 当我们应用统计方法对数据进行分析时,会发现很多方法都要求数据服从正态分布或近似服从正态分布,例如t检验.方差分析.线性回归等,所以对数据进行正态性检验是很有必要的,这节就介绍一下如何用SPSS对 ...

  4. LeetCode 587. 安装栅栏【凸包算法】【C++】【很多坑】

    凸包算法不难理解,写代码的时候主要是几何上的判定条件很容易写错. 算法的总体思想是: 1.给所有的点排序,找出极点(纵坐标最小的点,如果纵坐标一样,取横坐标最小的点) 2.除了极点之外,所有其他的点排 ...

  5. SW练习_点的位置_点线关系

    https://koitp.org/problem/POSITION_OF_POINT 求最后两个点,是在图形的外面,还是里面 换成了double,依然没有AC,只是从30 / 100提升到了90 / ...

  6. ks检验与s-w 检验_「学习」AD, RJ和KS-哪种正态性检验是最好的?

    Minitab中的正态性检验提供了三种方法:Anderson-Darling(AD),Ryan-Joiner(RJ)和Kolmogorov-Smirnov(KS).AD检验是默认的,那它在检验非正态的 ...

  7. 凯撒密码和栅栏密码 - 密码学01

    凯撒密码和栅栏密码 让编程改变世界 Change the world by program 我们将会学到什么?! 这相信是大家广泛关注的话题,因为如果一开始给大家一个强大而震撼的目录,然后就是一屁股的 ...

  8. 连续状态方程离散化与凸包表示形式

    介绍下两个常用的离散化方法:(1)前向欧拉法:(2)零阶保持法. 零阶保持法在精确度和稳定性方面优于欧拉法. 一.前向欧拉法 思路:前向欧拉法也可以理解为前向差分法,其基本思想为近似迭代,采用如下公式 ...

  9. 攻防世界-Crypto-Railfence

    题目描述:被小鱼一连将了两军,你心里更加不服气了.两个人一起继续往前走, 一路上杂耍卖艺的很多,但是你俩毫无兴趣,直直的就冲着下一个谜题的地方去了. 到了一看,这个谜面看起来就已经有点像答案了样子了, ...

最新文章

  1. shell 判断_shell之条件判断和流程控制
  2. js、css的阻塞问题
  3. MyBatis分页插件PageHelper使用练习
  4. 超4000人参加源码共读,喊你来一起学习成长~打开新世界
  5. 《Reids 设计与实现》第十二章 复制
  6. 苹果收购倒闭智能家居安防初创公司 Lighthouse AI 专利...
  7. 宁波计算机程序32届初赛,25届宁波市中小学计算机程序设计竞赛初赛试题
  8. homebrew安装及常用命令
  9. echarts x轴文字个数太多_echartsX轴文本数据太长溢出问题
  10. 第一章c语言入门,linux C语言程序设计 从入门到放弃——入门第一章
  11. 海南师范大学本科毕业论文答辩PPT模板
  12. java转大写的方法_Java字母大小写转换的方法
  13. DSL是什么意思?Mbps是什么意思?
  14. 隐枚举法求解0-1整数规划
  15. webpack打包vue项目之后dist文件夹在本地跑起来
  16. RNN及变体LSTM、GRU(在NILM中的应用)
  17. fets去除回车符号
  18. Java项目对接天眼查
  19. 响应式卡片悬停效果 html+css
  20. YouDianCMS建站系统|什么是五站合一?

热门文章

  1. c++如何将十进制转换成二进制
  2. 刷题记录:牛客NC201612I love you
  3. sklearn中一些参数
  4. ABAP MESSAGE消息类的创建以及调用方法。
  5. 论文解读:Factual Probing Is [MASK]: Learning vs. Learning to Recall
  6. 灵魂画手必读:只需完成手画线稿,让AI算法帮你自动上色
  7. opencv——SURF特征点检测并使用Flann算法匹配
  8. 【智慧物业方案】基于EasyCVR搭建“互联网+物业”,助力物业管理智能化
  9. IDEA中的Structure模块使用详解
  10. kuberSphere搭建中间件