/**
 
题意:
   判断线段是否相交  (包括间接相交)
   输入:
    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. linux进程地址空间详解(转载)

    linux进程地址空间详解(转载) 在前面的<对一个程序在内存中的分析 >中很好的描述了程序在内存中的布局,这里对这个结果做些总结和实验验证.下面以Linux为例(实验结果显示window ...

  2. HTML5 WebAudioAPI简介(一)

    一.常用对象 1.AudioContext对象 AudioContext是一个专门用于音频处理的接口,并且原理是讲AudioContext创建出来的各种节点(AudioNode)相互连接,音频数据流经 ...

  3. TabHost理解与使用

    一.继承关系 java.lang.Object ↳ android.view.View ↳ android.view.ViewGroup ↳ android.widget.FrameLayout ↳ ...

  4. 在Java控制台模拟dos命令下操作MySQL

    一.导入mysql的驱动:"com.mysql.jdbc.Driver", 必须将mysql的驱动 包(jar文件)导入到本工程中. Class.forName("com ...

  5. angular调用WCF服务,读取文件夹下图片显示列表,下载另存为图片

    读取文件夹下的文件 public string ReadImagesPaths() { string result = string.Empty; try { string path = System ...

  6. JavaScript HTML DOM - 改变 HTML

    JavaScript HTML DOM - 改变 HTML HTML DOM 允许 JavaScript 改变 HTML 元素的内容. 改变 HTML 输出流 JavaScript 能够创建动态的 H ...

  7. null和undefined的区别

    不同之处: null是js语言的关键字,它表示一个特殊值,常用来描述“空值”.对null执行typeof运算,结果返回字符串“object”,也就是说,可以将null认为是一个特殊的对象值,含义是“非 ...

  8. js中的潜伏者之Arguments对象

    argument 说明: 在JavaScript中,arguments是对象的一个特殊属性.arguments对象就像数组,但是它却不是数组.可以理解为他是潜伏者,通俗的说,就是你传的参数不一定按照参 ...

  9. Html5的<button>标签

    1.标签是双标签,其内可添加文字,图片等复杂的样式. ​2.不仅可以在表单中使用,还可以在其他块元素和内联元素中使用. 3.一般在input标签内添加name属性,否则提交后不显示.

  10. SQL 测试

    1.SQL 指的是? 您的回答:Structured Query Language 2.哪个 SQL 语句用于从数据库中提取数据? 您的回答:SELECT 3.哪条 SQL 语句用于更新数据库中的数据 ...