hdu 1558 Segment set 线段相交+并查集
2014-04-09 20:38
429 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1558
题目大意:有T组测试数据,对每组测试数据,有N行,如果输入的字符为P ,接着输入两个点的横纵坐标,即为一个线段的两个端点,如果字符为P,接着输入一个序号K,输出与第K次输入的线段有交点的线段的总数。题意很明显使用并查集,但是对于线段相交的判断比较麻烦,代码如下:
这道题最重要的应该是学会了线段相交的模板。。。
题目大意:有T组测试数据,对每组测试数据,有N行,如果输入的字符为P ,接着输入两个点的横纵坐标,即为一个线段的两个端点,如果字符为P,接着输入一个序号K,输出与第K次输入的线段有交点的线段的总数。题意很明显使用并查集,但是对于线段相交的判断比较麻烦,代码如下:
#include<stdio.h> #define max(a,b) (a>b?a:b) #define min(a,b) (a>b?b:a) int T,n; struct point{double x,y;};//点的结构体 struct zb{point a,b;}s[1005];//线段的结构体 int f[1005],rank[1005]; void init()//并查集的初始化 { for(int i=1;i<1005;i++) { f[i]=i;rank[i]=1; } } int find(int x)//状态压缩查找 { if(x==f[x]) return x; return f[x]=find(f[x]); } void merge(int x,int y)//按秩合并 { int fx=find(x); int fy=find(y); if(fx!=fy) { if(rank[fx]>rank[fy]) {rank[fx]+=rank[fy];f[fy]=fx;} else {rank[fy]+=rank[fx];f[fx]=fy;} } } double ccw(point a,point b,point c)//三角形的有向面积,用来判断 //点c在直线a,b的左边还是右边,大于零左边,小于零右边,等于零直线上 { double m=(a.x*b.y+b.x*c.y+c.x*a.y-a.x*c.y-b.x*a.y-c.x*b.y); return m; } //判断两个线段是否相交,前面四个条件是使两条线段形成一个包围盒,如果有交点 //肯定在包围盒内,后面两个条件是保证使一条线段的两点不在另外一条线段的一侧 bool judge(point a,point b,point c,point d) { if(max(a.x,b.x)>=min(c.x,d.x)&&max(a.y,b.y)>=min(c.y,d.y)&& max(c.x,d.x)>=min(a.x,b.x)&&max(c.y,d.y)>=min(a.y,b.y)&& ccw(a,b,c)*ccw(a,b,d)<=0&&ccw(c,d,a)*ccw(c,d,b)<=0) return true; return false; } int main() { char c[2]; scanf("%d",&T); while(T--) { int k=1; scanf("%d",&n); init(); while(n--) { scanf("%s",c); if(c[0]=='P') { scanf("%lf%lf%lf%lf",&s[k].a.x,&s[k].a.y,&s[k].b.x,&s[k].b.y); for(int i=1;i<k;i++) { if(judge(s[i].a,s[i].b,s[k].a,s[k].b)) merge(i,k); } k++; } else { int f; scanf("%d",&f); printf("%d\n",rank[find(f)]);//rank[]的大小就是当前包含的线段数 } } if(T) printf("\n"); } }
这道题最重要的应该是学会了线段相交的模板。。。
相关文章推荐
- 简说JAVA8引入函数式的问题。
- 网站推广方法主要有哪几大类?
- 【最短路径之Dijkstra算法详细讲解 】
- 编程之美 正方形
- Lotto
- Ubuntu 南大源
- Self Numbers
- ZOJ 3594 年份水题 【注意:没有0年】
- HAL层开发基础
- Date类和SimpleDateFormat类
- PS图层混合算法之六(差值,溶解, 排除)
- PS图层混合算法之六(差值,溶解, 排除)
- 读书笔记(三)——《山楂树之恋》敢爱吗?
- dijit样式定制(三)Button、RadioButton、CheckBox
- 《基于ORACLE的SQL优化读书》笔记 绑定变量分级
- 关于内连接和外连接(待补充)
- Windows下Subversion和Apache的安装及配置(一)
- Struts2开发环境搭建
- 设计模式总结
- day_5 使servlet小程序连接数据库