您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj 算法