poj 1127 Jack Straws 并查集+线段规范相交的判断
2015-12-04 11:30
323 查看
//poj 1127 //sep9 #include <iostream> using namespace std; struct P { int x,y; }p[128]; int f[32]; int det(P a,P b,P c) { int x1=b.x-a.x; int y1=b.y-a.y; int x2=c.x-a.x; int y2=c.y-a.y; return x1*y2-x2*y1; } int get_sign(int x) { if(x==0) return 0; return x>0?1:-1; } int between(P mid,P a,P b) { return mid.x<=max(a.x,b.x)&&mid.y<=max(a.y,b.y)&&mid.x>=min(a.x,b.x)&&mid.y>=min(a.y,b.y); } bool crossed(P a,P b,P c,P d) { int d1,d2,d3,d4; d1=get_sign(det(a,b,c)); d2=get_sign(det(a,b,d)); d3=get_sign(det(c,d,a)); d4=get_sign(det(c,d,b)); if((d1^d2)==-2&&(d3^d4)==-2) return true; if((d1==0&&between(c,a,b))|| (d2==0&&between(d,a,b))|| (d3==0&&between(a,c,d))|| (d4==0&&between(b,c,d))) return true; return false; } int find(int x) { return f[x]==x?x:f[x]=find(f[x]); } int main() { int n; while(scanf("%d",&n)==1&&n){ for(int i=1;i<=n;++i) scanf("%d%d%d%d",&p[i].x,&p[i].y,&p[i+n].x,&p[i+n].y); for(int i=1;i<=n;++i) f[i]=i; for(int i=1;i<=n;++i) for(int j=1;j<i;++j) if(crossed(p[i],p[i+n],p[j],p[j+n])){ int fa=find(i); int fb=find(j); if(fa!=fb) f[fa]=fb; } int x,y; while(scanf("%d%d",&x,&y)==2){ if(x==0&&y==0) break; int fa=find(x); int fb=find(y); printf("%s\n",fa==fb?"CONNECTED":"NOT CONNECTED"); } } return 0; }
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析
- C#获取关键字附近文字算法实例