hdu 1588 线段相交+并查集
来源:互联网 发布:电子琴节奏软件 编辑:程序博客网 时间:2024/04/28 02:53
判断第k个线段的集合中一共有几条线段。
先用并查集将相交的线段合并记录,最后查询sum数组即可。
#include<iostream>#include<string>#include<cstring>using namespace std;struct node{double x;double y;}s[2004];struct edge{node a,b;int num;}E[2005];int fa[2005];int sum[2005]; int T,n,cha;char c;int m=0;double direction (node p0, node p1, node p2) { return ((p2.x - p0.x)*(p1.y - p0.y) - (p1.x - p0.x)*(p2.y - p0.y)); } bool on_segment (node p0, node p1, node p2)//判断线段相交{ double minx, maxx, miny, maxy; minx = min(p0.x, p1.x); maxx = max(p0.x, p1.x); miny = min(p0.y, p1.y); maxy = max(p0.y, p1.y); if (p2.x >= minx && p2.x <= maxx && p2.y >= miny && p2.y <= maxy) return true; else return false; } bool segments_intersect (node p1, node p2, node p3, node p4) { double d1, d2, d3, d4; d1 = direction(p3, p4, p1); d2 = direction(p3, p4, p2); d3 = direction(p1, p2, p3); d4 = direction(p1, p2, p4); if (((d1 < 0 && d2 > 0) || (d1 > 0 && d2 < 0)) && ((d3 < 0 && d4 > 0) || (d3 > 0 && d4 < 0))) return true; else if (d1 == 0 && on_segment(p3, p4, p1)) return true; else if (d2 == 0 && on_segment(p3, p4, p2)) return true; else if (d3 == 0 && on_segment(p1, p2, p3)) return true; else if (d4 == 0 && on_segment(p1, p2, p4)) return true; else return false; } //并查集操作 void init(){for(int i=1;i<=n;i++){ fa[i]=i; sum[i]=1;}}int find(int x){if(x!=fa[x])fa[x]=find(fa[x]);return fa[x];}void combine(int x,int y){int xx=find(x);int yy=find(y);if(xx==yy)return ; fa[xx]=yy; sum[yy]+=sum[xx];}int main(){cin>>T;while(T--){ cout<<(m++?"\n":"");cin>>n;init();int cixu=1;for(int i=1;i<=n;i++){cin>>c;if(c=='P'){cin>>E[cixu].a.x>>E[cixu].a.y>>E[cixu].b.x>>E[cixu].b.y;E[cixu].num=cixu;for(int j=1;j<cixu;j++){if(segments_intersect(E[j].a,E[j].b,E[cixu].a,E[cixu].b)){combine(E[j].num,E[cixu].num);}}cixu++;} if(c=='Q'){cin>>cha;cout<<sum[find(cha)]<<endl;}} }return 0;}
0 0
- hdu 1588 线段相交+并查集
- hdu 1558 并查集+线段相交
- hdu 1558(线段相交+并查集)
- hdu 1558 线段相交判断 + 并查集
- hdu 1558 并查集 加 判断线段相交
- HDU 1558 Segment set (并查集+线段相交)
- hdu 1558 Segment set(并查集+线段相交)
- hdu 1558 Segment set 线段相交+并查集
- hdu 1558 判断线段相交 + 并查集
- hdu 1558(线段相交+并查集)
- HDU 1558 Segment set(线段相交+并查集)
- HDU 1558 Segment set(判断线段相交+并查集)
- HDU 1158 Segment set(线段相交 并查集)
- hdu 1558 Segment set(线段相交+并查集)
- HDU 1558 Segment set 并查集 线段相交
- HDU 1558 判断两个线段相交附带并查集
- HDU 1558 (并查集+判断线段相交)
- HDU-1558,Segment set,并查集+线段相交模拟
- Linux下Eclipse+JDK+Tomcat安装及环境配置
- 自定义控件 防腾讯视频分类视图(1)
- RS232 RS422 RS485的本质区别
- spoj 839 OPTM - Optimal Marks(最小割应用)
- createFCK函数,FCKEditor编辑器在轻开平台中的使用例子二
- hdu 1588 线段相交+并查集
- [原]Nginx重定向Rewrite分析
- Oracle 添加用户并赋权,修改密码,解锁,删除用户的方法
- python - scapy - arpscanner
- 简单的四则运算计算器
- 《JVM故障诊断指南》之5 —— HPROF :使用Eclipse Memory Analyzer 工具 (MAT)进行内存泄露分析
- 对C++派生类的一个简单介绍
- AJAX传参,JS获取当前URL参数(超级实用)
- 黑马程序员_java基础之反射及高新技术