/**
 
题意:
   判断线段是否相交  (包括间接相交)
   输入:
    N(代表有n条线段)
    sx  sy  ex  ey(一条直线的两端点的坐标)
    ;
    ;
    ;
    a b(判断第a条和第b条线段是否相交)
    :
    :
     :
    0 0输入0 0 询问结束
    输出:若相交输出  CONNECTED
          否则         NOT CONNECTED
*/
 
 
#include<stdio.h>
#include<iostream>
using namespace std;
struct node
{
    int sx,sy;
    int ex,ey;
} bian[20];
int vest[20];
bool isXiangJiao(node a,node b)///根据两条向量的积 来判断两条直线段的夹角  (看图解)
{
    int d1,d2,d3,d4;
    d1=(a.ex-a.sx)*(b.sy-a.sy)-(a.ey-a.sy)*(b.sx-a.sx);
    d2=(a.ex-a.sx)*(b.ey-a.sy)-(a.ey-a.sy)*(b.ex-a.sx);
    d3=(b.ex-b.sx)*(a.sy-b.sy)-(b.ey-b.sy)*(a.sx-b.sx);
    d4=(b.ex-b.sx)*(a.ey-b.sy)-(b.ey-b.sy)*(a.ex-b.sx);
    if(d1*d2<=0&&d3*d4<=0)return true;
    else return false;
}
void init(int n)
{
    for(int i=0; i<=n; i++)
        vest[i]=i;
}
int Find(int t)
{
    if(vest[t]==t)return t;
    return Find(vest[t]);
}
bool merge(int a,int b)
{
    int x=Find(a);
    int y=Find(b);
    if(x!=y)
    {
        vest[x]=y;
        return true;
    }
    return false;
}
void panDuan(int n)
{
    for(int i=1;i<=n-1;i++)
    {
        if(isXiangJiao(bian[i],bian[n]))
        {
             merge(i,n);///若相交 讲两条线段加入同一个集合内
        }
 
    }
}
bool isGuanXi(int a,int b)
{
    if(Find(a)==Find(b))return true;
    return false;
}
int main()
{
    int n;
    while(scanf("%d",&n),n)
    {
        init(n);
        for(int i=1; i<=n; i++)
        {
             scanf("%d%d%d%d",&bian[i].sx,&bian[i].sy,&bian[i].ex,&bian[i].ey);
             panDuan(i);///向前比较是否和此条线段相交
        }
        int a,b;
        while(scanf("%d%d",&a,&b))
        {
            if(a==0&&b==0)break;
            if(isGuanXi(a,b))///判断 两条线段是否有关系
            {
                printf("CONNECTED\n");
            }
            else printf("NOT CONNECTED\n");
        }
    }
    return 0;
}

Jack Straws(判断线段是否相交 + 并查集)的更多相关文章

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

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

  2. 判断线段相交(hdu1558 Segment set 线段相交+并查集)

    先说一下题目大意:给定一些线段,这些线段顺序编号,这时候如果两条线段相交,则把他们加入到一个集合中,问给定一个线段序号,求在此集合中有多少条线段. 这个题的难度在于怎么判断线段相交,判断玩相交之后就是 ...

  3. hdu 1558 (线段相交+并查集) Segment set

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1558 题意是在坐标系中,当输入P(注意是大写,我当开始就wa成了小写)的时候输入一条线段的起点坐标和终点坐 ...

  4. Any Way You Slice It (向量旋转 以及 判断线段是否相交)(模板)

    http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11353 #include<iostream> # ...

  5. Educational Codeforces Round 51 (Rated for Div. 2) G. Distinctification(线段树合并 + 并查集)

    题意 给出一个长度为 \(n\) 序列 , 每个位置有 \(a_i , b_i\) 两个参数 , \(b_i\) 互不相同 ,你可以进行任意次如下的两种操作 : 若存在 \(j \not = i\) ...

  6. BZOJ4399魔法少女LJJ——线段树合并+并查集

    题目描述 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的绿色世界,空气清新.淡雅,到处散发着醉人的奶浆味: ...

  7. 2018.09.30 bzoj4025: 二分图(线段树分治+并查集)

    传送门 线段树分治好题. 这道题实际上有很多不同的做法: cdq分治. lct. - 而我学习了dzyo的线段树分治+并查集写法. 所谓线段树分治就是先把操作分成lognlognlogn个连续不相交的 ...

  8. 【BZOJ2733】永无乡(线段树,并查集)

    [BZOJ2733]永无乡(线段树,并查集) 题面 BZOJ 题解 线段树合并 线段树合并是一个很有趣的姿势 前置技能:动态开点线段树 具体实现:每次合并两棵线段树的时候,假设叫做\(t1,t2\), ...

  9. 洛谷P4121 [WC2005]双面棋盘(线段树套并查集)

    传送门 先膜一下大佬->这里 据说这题正解是LCT,然而感觉还是线段树套并查集的更容易理解 我们对于行与行之间用线段树维护,每一行内用并查集暴力枚举 每一行内用并查集暴力枚举连通块这个应该容易理 ...

随机推荐

  1. php100视频原始地址列表整理:

    php100视频原始地址列表整理: 教程名称 . 1:环境配置与代码调试 2:PHP的数据类型与源码调试 3:常用PHP运算类型介绍与应用 4: PHP条件语句介绍与应用 5:PHP循环语句的介绍与应 ...

  2. Linux 自动更新时间

    1. 从NTP上把时间同步到本地 cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 2. 更新本地时间 ntpdate us.pool.ntp.o ...

  3. iOS RC4加解密算法

    -(NSString *)encrypt:(NSString *)string withKey:(NSString *)key{ self.sBox = [[self frameSBox:key] m ...

  4. 微信小程序开发之入门篇(熟悉项目结构)

    微信小程序创建之后会生成一个项目模板,如下图所示(基本如此,但并不局限于此) 现在分别来说明一下每个文件及目录的意思 app.js 程序的入口文件,必须存在. app.js是小程序的脚本代码.我们可以 ...

  5. cocod2d-x 之 CCTMXTiledMap & CCTMXLayer

    cocos2dx框架自带的地图CCTMXTiledMap,继承自CCNode.CCTMXTiledMap的坐标系的原点位于左上角,以一个瓦片为单位,换句话说,左上角第一块瓦片的坐标为(0,0),而紧挨 ...

  6. TatukGIS - GisDefs - CheckFileWriteAccess 函数

    函数名称  CheckFileWriteAccess 所在单元  GisDefs 函数原型           1  function CheckFileWriteAccess(const _file ...

  7. 在Apache中利用ServerAlias设置虚拟主机接收多个域名和设置域名泛解析

    ServerAlias:服务器别名,在Apache中可以用于设置虚拟主机接收到个域名,也可以用于接收泛解析的域名.具体的设置方法如下: 一.用于设置虚拟主机接收多个域名 一个虚拟主机常常会接收多个域名 ...

  8. Git配置安装使用教程操作github上传克隆数据

    Git是何方神圣? Git是用C语言开发的分布版本控制系统.版本控制系统可以保留一个文件集合的历史记录,并能回滚文件集合到另一个状态(历史记录状态).另一个状态可以是不同的文件,也可以是不同的文件内容 ...

  9. ps批量修改图片

    批量更改图片尺寸的ps脚本 高端干货!PHOTOSHOP实用脚本大合集

  10. BZOJ 1296 粉刷匠

    Description windy有\(N\)条木板需要被粉刷.每条木板被分为\(M\)个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色. ...