题意:

给出一系列线段,判断某两个线段是否连通.

思路:

根据线段相交情况建立并查集, 在同一并查集中则连通.

(第一反应是强连通分量...实际上只要判断共存即可, 具体的方向啊是没有关系的..)

并查集合并的时候是根节点合并.

快速排斥试验不是必需的, 大规模数据可能是个优化吧.

跨立试验注意共线的情况.

共线判断注意与y 轴平行的情况.

#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const double EPS = 1e-6;
const int INF = 0x3f3f3f3f;
const int MAXN = 15;
typedef struct node
{
double x,y;
}point;
point a[MAXN],b[MAXN];
bool adj[MAXN][MAXN];
int n; int max(int a, int b)
{
int diff = b - a;
return b - (diff & (diff>>31));
}
int min(int a, int b)
{
int diff = b - a;
return a + (diff & (diff>>31));
}
int fa[MAXN]; int FindSet(int x)
{
if(x==fa[x]) return fa[x];
return fa[x] = FindSet(fa[x]);
} int dcmp(double p)
{
if(fabs(p)<EPS) return 0;
return p>0?1:-1;
} double det(double x1, double y1, double x2, double y2)
{
return x1*y2 - x2*y1;
} double cross(point A, point B, point P)
{
return det(B.x - A.x, B.y - A.y, P.x - A.x, P.y - A.y);
} bool ck(point A, point B, point C, point D)
{
int min1x = min(A.x,B.x), min2x = min(C.x,D.x);
int max1x = max(A.x,B.x), max2x = max(C.x,D.x);
int min1y = min(A.y,B.y), min2y = min(C.y,D.y);
int max1y = max(A.y,B.y), max2y = max(C.y,D.y);
/*if(max(max1x,max2x)-min(min1x,min2x)>(max1x-min1x)+(max2x+min2x) ||
max(max1y,max2y)-min(min1y,min2y)>(max1y-min1y)+(max2y+min2y)) return false;*/
int a = dcmp(cross(A, B, C));
int b = dcmp(cross(A, B, D));
if(!a && !b)
return ( max(max1x,max2x)-min(min1x,min2x)<=(max1x-min1x)+(max2x-min2x)
&& max(max1y,max2y)-min(min1y,min2y)<=(max1y-min1y)+(max2y-min2y) );
int c = dcmp(cross(C, D, A));
int d = dcmp(cross(C, D, B));
return (( a* b <= 0) && ( c* d <= 0));//规范或不规范相交
} void BuildSet()
{
for(int i=1;i<=n;i++)
{
fa[i] = i;
}
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(ck(a[i],b[i],a[j],b[j]))
{
int fi = FindSet(i), fj = FindSet(j);//并查集写错了= =
fa[fi] = fj;
}
}
}
} bool check(int a, int b)
{
return (FindSet(a)==FindSet(b));
} int main()
{
int x, y;
while(scanf("%d",&n)==1 && n)
{
for(int i=1;i<=n;i++)
scanf("%lf %lf %lf %lf",&a[i].x,&a[i].y,&b[i].x,&b[i].y);
BuildSet();
while(scanf("%d %d",&x,&y)==2 && (x+y))
{
if(check(x, y)) printf("CONNECTED\n");
else printf("NOT CONNECTED\n");
}
} }

[poj 1127]Jack Straws[线段相交][并查集]的更多相关文章

  1. TTTTTTTTTTTTTT poj 1127 Jack Straws 线段相交+并查集

    题意: 有n个木棍,给出木棍的两个端点的x,y坐标,判断其中某两个线段是否连通(可通过其他线段连通) #include <iostream> #include <cstdio> ...

  2. POJ 1127 Jack Straws (线段相交)

    题意:给定一堆线段,然后有询问,问这两个线段是不是相交,并且如果间接相交也可以. 析:可以用并查集和线段相交来做,也可以用Floyd来做,相交就是一个模板题. 代码如下: #pragma commen ...

  3. poj1127 Jack Straws(线段相交+并查集)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Jack Straws Time Limit: 1000MS   Memory L ...

  4. TZOJ 1840 Jack Straws(线段相交+并查集)

    描述 In the game of Jack Straws, a number of plastic or wooden "straws" are dumped on the ta ...

  5. poj 1127:Jack Straws(判断两线段相交 + 并查集)

    Jack Straws Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2911   Accepted: 1322 Descr ...

  6. POJ 1127 Jack Straws(计算几何)

    题目链接 抄的模版,居然1Y了.就是简单的线段相交+并查集. #include <iostream> #include <cstring> #include <cstdi ...

  7. poj 1127 -- Jack Straws(计算几何判断两线段相交 + 并查集)

    Jack Straws In the game of Jack Straws, a number of plastic or wooden "straws" are dumped ...

  8. TOJ1840: Jack Straws 判断两线段相交+并查集

    1840: Jack Straws  Time Limit(Common/Java):1000MS/10000MS     Memory Limit:65536KByteTotal Submit: 1 ...

  9. hdu 1558 线段相交+并查集

    题意:要求相交的线段都要塞进同一个集合里 sol:并查集+判断线段相交即可.n很小所以n^2就可以水过 #include <iostream> #include <cmath> ...

随机推荐

  1. [置顶] DX报表的开发流程(1)

    DevExpress.XtraReports简称为DX报表. 本文主要介绍下VS2010项目中如何开发DX报表,具体的内容包括: (1)下载安装 (2)报表文件创建 (3)页面文件的创建 (4)页面的 ...

  2. Delphi中关于Rtti的一些操作(一)

    function TForm1.ShowMethodAddress(aObj: TDerived; const sData: String) : Pointer;var  aPtr : Pointer ...

  3. cocos2d学习笔录1

    CCDirector的主要作用: 1.访问和改变场景: 2.访问cocos2d-x的配置细节 3.访问视图(OPENGL,UIVIEW,UIWINDOW): 4.暂停,恢复和结束游戏: 5.在UIKi ...

  4. java实现小九机器人接口

    package com.iask.webchat.chatmachine; import java.net.URLEncoder; import org.apache.http.HttpEntity; ...

  5. 【Android】 -- 使用UncaughtExceptionHandler捕捉全局异常

    在综合统计SDK(欧盟统计局的朋友,百度统计)之后.有一个非常有利的功能测试:错误分析.此功能可以在程序的执行中遇到崩溃(runtimeException)反馈给server,帮助开发者提高产品.多功 ...

  6. winform基础——实现简易赈灾物资发放登记系统

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...

  7. C#判断文件是否正在被使用

    生成文件的时候,如果该文件夹下的同名文件被打开(或者被使用),如果这时再生成一个同名文件,则会提示文件正在被占用. 解决方法有两个,一个是保存的文件名改成该文件夹下不存在的(随机数之类的XXOO都行, ...

  8. eval 捕获dbi错误

    [root@dr-mysql01 ~]# cat t2.pl use DBI; my $dbUser='zabbix'; my $user="root"; my $passwd=& ...

  9. Ajax - 登录

    Login.html <head> <title>登录</title> <mce:script src="js/jquery-1.5.2.js&qu ...

  10. mysql 主从同步出问题,重新修复从库 - web架构研究

    mysql 主从同步出问题,重新修复从库 - web架构研究     mysql 主从同步出问题,重新修复从库    0     昨天由于操作失误,在从库上执行一堆sql之后,导致主从同步错误,并且已 ...