/**
 
题意:
   判断线段是否相交  (包括间接相交)
   输入:
    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. healthkit 记录每天用户的运动情况

    //详细操作步骤 http://www.csdn.net/article/2015-01-23/2823686-healthkit-tutorial-with-swift //官方api https: ...

  2. cocos2d中如何使用图片纹理图集的加载来实现一个动画的功能

    cocos2d中要实现一个动画,一般采用纹理图集的方式,也就是说把几个连续动作的图片挨个显示切换这样就是动画 一: 首先先看下今天要实现的具体的目的,打飞机的时间屏幕上会有一个喷火的小飞机,飞机的尾部 ...

  3. Xaml中的资源(1 样式)

    <Window x:Class="MyResoures.MainWindow" xmlns="http://schemas.microsoft.com/winfx/ ...

  4. Problem 1183 - 排列

    #include<iostream> #include<vector> #include<algorithm> using namespace std; int c ...

  5. ajax jsonp 原理 以及对数据的处理

    ajax请求 var xmlhttp; if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari xml ...

  6. js事件练习--登录界面演示。

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. easyui tree 判断点击的节点是否还存在子节点

    有些业务需求是要求tree一次性全部加载,有些是需要异步加载的. 如果是一次性全部加载的tree,那怎么判断点击的节点是否还存在子节点? function loadTree(){ $('#tree') ...

  8. CSS动画:Transform中使用频繁的scale,rotate,translate动画

    动画中,skew只是transform中的一种形式的动画,我们还可以学习scale,rotate,translate.这是目前使用比较频繁的属性动作. 1.scale动画的定义:(单位数值) scal ...

  9. ThinkPHP接入支付宝支付功能

    最近做系统,需要实现在线支付功能,毫不犹豫,选择的是支付宝的接口支付功能.这里我用的是即时到帐的接口,具体实现的步骤如下: 一.下载支付宝接口包 下载地址:https://b.alipay.com/o ...

  10. 除法(Division ,UVA 725)-ACM集训

    参考:http://www.cnblogs.com/xiaobaibuhei/p/3301110.html 算法学到很弱,连这么简单个问题都难到我了.但我偏不信这个邪,终于做出来了.不过,是参照别人的 ...