poj 1127 Jack Straws(计算几何)
2014-03-05 11:49
429 查看
题意大致就是给你n根木棍还有它们的端点坐标,每次一个询问,问第i根和第j根木棍是否相连(就是是否两条线段存在交点),能够通过其它木棍相连也视为相连
这里用到了内积和外积的知识,也就是点积和叉积
比如给定一个直线p1-p2如果(p1-q)与(p2-p)的外积,也就是(p1-q).det(p2-q)==0那么就可以判断这个点在p1-p2的这条直线上,接下来判断
内积(p1-q).dot(p2-q)<=0 就说明点q在点p1到点p2之间,也就是在线段上。
本题要注意的一点就是如果两条线段平行要特判,分为两种情况相交和不相交
这里用到了内积和外积的知识,也就是点积和叉积
比如给定一个直线p1-p2如果(p1-q)与(p2-p)的外积,也就是(p1-q).det(p2-q)==0那么就可以判断这个点在p1-p2的这条直线上,接下来判断
内积(p1-q).dot(p2-q)<=0 就说明点q在点p1到点p2之间,也就是在线段上。
本题要注意的一点就是如果两条线段平行要特判,分为两种情况相交和不相交
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<vector> using namespace std; double EPS = 1e-10; double add(double a,double b){ if(abs(a+b)<EPS*(abs(a)+abs(b))) return 0; return a+b; } struct P{ double x,y; P() {} P(double x,double y) : x(x),y(y){ } P operator +(P p){ return P(add(x,p.x),add(y,p.y)); } P operator -(P p){ return P(add(x,-p.x),add(y,-p.y)); } P operator *(double d){ return P(x*d,y*d); } double det(P p){ return add(x*p.y,-y*p.x); } double dot(P p){ return add(x*p.x,y*p.y); } }; bool on_seg(P p1,P p2,P q){ return (p1-q).det(p2-q)==0 && (p1-q).dot(p2-q)<=0; } P in(P p1,P p2,P q1,P q2){ return p1+ (p2-p1) *( (q2-q1).det(q1-p1) / (q2-q1).det(p2-p1) ); } bool g[200][200]; int main() { // freopen("kepin.txt","r",stdin); // freopen("output.txt","w",stdout); int n; P p[200],q[200]; while(~scanf("%d",&n) && n){ // memset(g,0,sizeof(g)); for(int i=0;i<n;i++){ scanf("%lf%lf%lf%lf",&p[i].x,&p[i].y,&q[i].x,&q[i].y); } for(int i=0;i<n;i++){ g[i][i]=1; for(int j=0;j<i;j++){ if((p[i]-q[i]).det(p[j]-q[j])==0){ g[i][j] = g[j][i] = on_seg(p[i],q[i],p[j])+on_seg(p[i],q[i],q[j])+on_seg(p[j],q[j],p[i])+on_seg(p[j],q[j],q[i]); } else{ P r=in(p[i],q[i],p[j],q[j]); g[i][j] = g[j][i] = on_seg(p[i],q[i],r) && on_seg(p[j],q[j],r); } } } for(int k=0;k<n;k++){ for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ g[i][j] |= g[i][k] && g[k][j]; } } } int a,b; while(~scanf("%d%d",&a,&b) && !(a==b && b==0)){ if(g[a-1][b-1]) printf("CONNECTED\n"); else printf("NOT CONNECTED\n"); } } return 0; }
相关文章推荐
- POJ 1127 Jack Straws [计算几何]
- POJ 1127 Jack Straws (计算几何)
- poj 1127 Jack Straws 计算几何 flod-warshall
- 【计算几何】 POJ 1127 Jack Straws 判断线段是否相交
- POJ1127——Jack Straws(计算几何,直线相交)
- 【计算几何】 POJ 1127 Jack Straws 判断线段是否相交
- POJ 1127 Jack Straws(计算几何)
- POJ 1127-Jack Straws(计算几何 线段相交)
- poj 1127 计算几何
- POJ 1127 —— 计算几何 && 线段相交
- POJ 1127 我的第一次计算几何
- poj 1127 计算几何入门题 求线段交点
- POJ 1127 基础计算几何(判断两线段相交)+并查集
- POJ 1127 计算几何+并查集
- poj1696---计算几何
- POJ 4048 Chinese Repeating Crossbow 简单计算几何
- POJ 2653 && HDU 1147 Pick-up sticks(计算几何)
- 计算几何 之 hdu 1077 poj 1981 O(n^3)
- POJ 1269 Intersecting Lines(计算几何)
- POJ题目分类---计算几何