题意:

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

思路:

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

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

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

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

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

共线判断注意与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. android第一天-------环境搭建

    今天正式第一天学习android的. 1.昨晚下班后回家跟同事刘江龙打了四把dota.还好,都赢了把对面虐成狗了.大多都是1300到1450的局,玩的很爽. 2.dota打完后给在湖南常德的女朋友打了 ...

  2. ASP.NET - 匹配标签中的内容

    string str = @"<td>Csdn</td>\r\n<td>V1.0</td>\r\n<td>2014-10-23&l ...

  3. 新发现的Cyberduck(映射网盘)和zsuncloud(硬件产品很新潮),群辉nas的确好用(购买链接)

    https://cyberduck.io/?l=en http://www.zsuncloud.com/ 群辉nas的确好用啊在哪里可以买到?官网 淘宝也可以自己做黑群晖 先用xpenoboot is ...

  4. boost::asio async_write也不能保证一次发完所有数据 一

    你要是看过basic_stream_socket的文档,里面提到async_write_some不能保证将所有要发送的数据都发出去.并且提到如果想这样做,需要使用boost asio的async_wr ...

  5. 王立平--PopupWindow

    MainActivity.java <span style="font-size:14px;">package com.main; import android.app ...

  6. Mongdb 访问

    http://114.55.75.xx/pics/201607040751367d21a38035bd4da7abd4473783f85f7a

  7. 基于visual Studio2013解决面试题之0304镜像二叉树

     题目

  8. boost function对象

    本文根据boost的教程整理. 主要介绍boost function对象的用法. boost function boost function是什么 boost function是一组类和模板组合,用于 ...

  9. Swift - 动画效果的实现方法总结(附样例)

    在iOS中,实现动画有两种方法.一个是统一的animateWithDuration,另一个是组合出现的beginAnimations和commitAnimations.这三个方法都是类方法. 一,使用 ...

  10. UVa11183 Teen Girl Squad, 最小树形图,朱刘算法

    Teen Girl Squad  Input: Standard Input Output: Standard Output You are part of a group of n teenage ...