[poj 1127]Jack Straws[线段相交][并查集]
题意:
给出一系列线段,判断某两个线段是否连通.
思路:
根据线段相交情况建立并查集, 在同一并查集中则连通.
(第一反应是强连通分量...实际上只要判断共存即可, 具体的方向啊是没有关系的..)
并查集合并的时候是根节点合并.
快速排斥试验不是必需的, 大规模数据可能是个优化吧.
跨立试验注意共线的情况.
共线判断注意与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[线段相交][并查集]的更多相关文章
- TTTTTTTTTTTTTT poj 1127 Jack Straws 线段相交+并查集
题意: 有n个木棍,给出木棍的两个端点的x,y坐标,判断其中某两个线段是否连通(可通过其他线段连通) #include <iostream> #include <cstdio> ...
- POJ 1127 Jack Straws (线段相交)
题意:给定一堆线段,然后有询问,问这两个线段是不是相交,并且如果间接相交也可以. 析:可以用并查集和线段相交来做,也可以用Floyd来做,相交就是一个模板题. 代码如下: #pragma commen ...
- poj1127 Jack Straws(线段相交+并查集)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Jack Straws Time Limit: 1000MS Memory L ...
- TZOJ 1840 Jack Straws(线段相交+并查集)
描述 In the game of Jack Straws, a number of plastic or wooden "straws" are dumped on the ta ...
- poj 1127:Jack Straws(判断两线段相交 + 并查集)
Jack Straws Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2911 Accepted: 1322 Descr ...
- POJ 1127 Jack Straws(计算几何)
题目链接 抄的模版,居然1Y了.就是简单的线段相交+并查集. #include <iostream> #include <cstring> #include <cstdi ...
- poj 1127 -- Jack Straws(计算几何判断两线段相交 + 并查集)
Jack Straws In the game of Jack Straws, a number of plastic or wooden "straws" are dumped ...
- TOJ1840: Jack Straws 判断两线段相交+并查集
1840: Jack Straws Time Limit(Common/Java):1000MS/10000MS Memory Limit:65536KByteTotal Submit: 1 ...
- hdu 1558 线段相交+并查集
题意:要求相交的线段都要塞进同一个集合里 sol:并查集+判断线段相交即可.n很小所以n^2就可以水过 #include <iostream> #include <cmath> ...
随机推荐
- PHP学习之-面向对象
PHP学习之-面向对象 1.什么是对象 "世界万物皆对象",一切可以被抽象出来的东西都是对象.像花,草.看不到的"概念"都是对象. 2.对象的基本组成 a.属性 ...
- PHPCMS V9数据库配置文件database.php位置
初次用PHPCMS V9的朋友可能找不到数据库配置文件,其实在官方的wiki中已经介绍了.那就是 caches\configs\database.php 文件. 初次用PHPCMS V9的朋友可能找不 ...
- appium 真机测试问题 出现 instruments crashed on startup
1.appium 真机测试的时候 instruments crashed on startup,必须在真机上打开UI Automation 在设置里: Developer->Enable UI ...
- HTTP数据包头解析(简单清楚)
[转]HTTP请求模型和头信息参考 参考: http://blog.csdn.net/baggio785/archive/2006/04/13/661410.aspx模型: http://blog.c ...
- poj2418 map 快排水过
/*计算每个单词的百分比按字典序输出*/ #include <cstdio>#include<cstdlib>#include <cstring>#include ...
- bat执行java程序的脚本解析
使用java执行带Package的class文件java package1.package2.className 或java -cp . package1.package2.className - ...
- c++ 类名和enum时重复时要在类名前加class::
c++ 类名和enum时重复时要在类名前加class:: 一些不好的习惯都是用小写,但又没有区分开token,看看代码再说,下面的代码是我在测试polymorphism时写的一部分,怎么也查不出,最后 ...
- dm642在线写EPROM.txt
void wirteEPROM() { //#include <stdio.h> unsigned short bufeprom[30],i,val; FILE *fp; ...
- 很具体GC学习笔记
GC学习笔记 这是我公司同事的GC学习笔记,写得蛮具体的,由浅入深,循序渐进,让人一看就懂,特转到这里. 一.GC特性以及各种GC的选择 1.垃圾回收器的特性 2.对垃圾回收器的选择 2.1 连续 V ...
- 微微信.NET:开源的ASP.NET微信公众号应用平台
题记: 平时喜欢使用 C# 编程.近半年玩微信公众平台,看到一些微信的应用系统大多是PHP.Python的,于是就有想法做一套开放的 C# ASP.NET的微信应用系统. 微微信.NET 基于ASP ...